From 427eab72600ca322e5e46ac79ad6c3072defd403 Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Wed, 13 Feb 2019 14:35:10 -0300 Subject: [PATCH 01/47] Capture autoupdate fetch errors Fetch errors should be logged and ignored. Autoupdate will run again on next start. --- public/main/main-window.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/main/main-window.js b/public/main/main-window.js index 5db4a72a..c283259f 100644 --- a/public/main/main-window.js +++ b/public/main/main-window.js @@ -36,6 +36,9 @@ function initAutoUpdate () { } autoUpdater.checkForUpdates() + .catch(function (err) { + logger.warn('Could not find updates', err.message) + }) autoUpdater.on('checking-for-update', () => logger.info('Checking for update...')) autoUpdater.on('update-available', () => logger.info('Update available.')) From 51e6cded2b39f68b4cd919d84abc261f3839306c Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Mon, 11 Feb 2019 19:29:05 -0300 Subject: [PATCH 02/47] Increase timeouts --- src/client/index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/client/index.js b/src/client/index.js index d979a0fe..0a65fb27 100644 --- a/src/client/index.js +++ b/src/client/index.js @@ -91,18 +91,18 @@ function createClient(createStore) { recoverFromMnemonic: utils.forwardToMainProcess('recover-from-mnemonic'), getAuctionGasLimit: utils.forwardToMainProcess('get-auction-gas-limit'), getTokensGasLimit: utils.forwardToMainProcess('get-tokens-gas-limit'), - portMetronome: utils.forwardToMainProcess('port-metronome', 120000), + portMetronome: utils.forwardToMainProcess('port-metronome', 750000), validatePassword: utils.forwardToMainProcess('validate-password'), - buyMetronome: utils.forwardToMainProcess('buy-metronome', 60000), - convertCoin: utils.forwardToMainProcess('convert-coin', 60000), - retryImport: utils.forwardToMainProcess('retry-import', 60000), - convertMet: utils.forwardToMainProcess('convert-met', 60000), + buyMetronome: utils.forwardToMainProcess('buy-metronome', 750000), + convertCoin: utils.forwardToMainProcess('convert-coin', 750000), + retryImport: utils.forwardToMainProcess('retry-import', 750000), + convertMet: utils.forwardToMainProcess('convert-met', 750000), onLoginSubmit: utils.forwardToMainProcess('login-submit'), getPortFees: utils.forwardToMainProcess('get-port-fees'), getGasLimit: utils.forwardToMainProcess('get-gas-limit'), getGasPrice: utils.forwardToMainProcess('get-gas-price'), - sendCoin: utils.forwardToMainProcess('send-coin', 60000), - sendMet: utils.forwardToMainProcess('send-met', 60000), + sendCoin: utils.forwardToMainProcess('send-coin', 750000), + sendMet: utils.forwardToMainProcess('send-met', 750000), clearCache: utils.forwardToMainProcess('clear-cache') } From b8e53715756b93289882742208dc39950d8f00b6 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Wed, 13 Feb 2019 12:13:24 -0300 Subject: [PATCH 03/47] Set activeWallet on wallet creation and only open activeWallet on start. --- public/main/client/handlers/single-core.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/public/main/client/handlers/single-core.js b/public/main/client/handlers/single-core.js index b8edb02a..a601c941 100644 --- a/public/main/client/handlers/single-core.js +++ b/public/main/client/handlers/single-core.js @@ -26,19 +26,21 @@ function createWallet (data, { coreApi, emitter }) { return Promise.all([ wallet.setSeed(data.seed, data.password), wallet.setAddressForWalletId(walletId, address) - ]).then(() => emitter.emit('create-wallet', { walletId })) + ]) + .then(wallet.setActiveWallet(walletId)) + .then(() => emitter.emit('create-wallet', { walletId })) } -const openWallet = ({ emitter }) => - wallet.getWallets().forEach(walletId => - wallet.getAddressesForWalletId(walletId).forEach(address => - emitter.emit('open-wallets', { - walletIds: [walletId], - activeWallet: walletId, - address - }) - ) +function openWallet ({ emitter }) { + const activeWallet = wallet.getActiveWallet() || wallet.getWallets()[0] + wallet.getAddressesForWalletId(activeWallet).forEach(address => + emitter.emit('open-wallets', { + walletIds: [activeWallet], + activeWallet, + address + }) ) +} function refreshAllTransactions ({ address }, { coreApi, emitter }) { emitter.emit('transactions-scan-started', {}) From e480025c2c4741d138c5dc126a215a3534acdcbe Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Wed, 13 Feb 2019 12:28:10 -0300 Subject: [PATCH 04/47] Fix then --- public/main/client/handlers/single-core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/main/client/handlers/single-core.js b/public/main/client/handlers/single-core.js index a601c941..e03b4a32 100644 --- a/public/main/client/handlers/single-core.js +++ b/public/main/client/handlers/single-core.js @@ -27,7 +27,7 @@ function createWallet (data, { coreApi, emitter }) { wallet.setSeed(data.seed, data.password), wallet.setAddressForWalletId(walletId, address) ]) - .then(wallet.setActiveWallet(walletId)) + .then(() => wallet.setActiveWallet(walletId)) .then(() => emitter.emit('create-wallet', { walletId })) } From 93d142adb71a3be689d8c114a0892a7c2cbddbbe Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Tue, 12 Feb 2019 12:00:41 -0300 Subject: [PATCH 05/47] Re-add port feature UI --- public/config/etcMorden.js | 29 ++++++++++++++++++++++ public/config/etcMordenLocal.js | 29 ++++++++++++++++++++++ public/config/ethMainnet.js | 4 +-- public/config/ethRopsten.js | 29 ++++++++++++++++++++++ public/config/ethRopstenLocal.js | 4 +-- src/components/Loading.js | 3 +-- src/components/Router.js | 4 +-- src/components/dashboard/tx-list/Filter.js | 4 +-- src/components/sidebar/PrimaryNav.js | 8 +++--- src/components/sidebar/Sidebar.js | 27 ++++++++------------ 10 files changed, 111 insertions(+), 30 deletions(-) create mode 100644 public/config/etcMorden.js create mode 100644 public/config/etcMordenLocal.js create mode 100644 public/config/ethRopsten.js diff --git a/public/config/etcMorden.js b/public/config/etcMorden.js new file mode 100644 index 00000000..e30f1200 --- /dev/null +++ b/public/config/etcMorden.js @@ -0,0 +1,29 @@ +'use strict' + +const MetronomeContracts = require('metronome-contracts') +const contracts = MetronomeContracts.morden + +module.exports = { + displayName: 'ETC (Morden)', + chainId: 2, + symbol: 'ETC', + + // contracts addresses + tokenPorterAddress: contracts.TokenPorter.address, + converterAddress: contracts.AutonomousConverter.address, + validatorAddress: contracts.Validator.address, + metTokenAddress: contracts.METToken.address, + auctionAddress: contracts.Auctions.address, + + // urls + explorerUrl: 'https://explorer.metronome.io', // TODO: update! + indexerUrl: 'https://indexer.metronome.io', // TODO: update! + metApiUrl: 'https://api.metronome.io/', // TODO: update! + wsApiUrl: 'wss://eth.wallet.metronome.io:8546', // TODO: update! + + // defauls + coinDefaultGasLimit: '21000', + metDefaultGasLimit: '250000', + defaultGasPrice: '1000000000', + maxGasPrice: '20000000000000000' +} diff --git a/public/config/etcMordenLocal.js b/public/config/etcMordenLocal.js new file mode 100644 index 00000000..64e7f7a3 --- /dev/null +++ b/public/config/etcMordenLocal.js @@ -0,0 +1,29 @@ +'use strict' + +const MetronomeContracts = require('metronome-contracts') +const contracts = MetronomeContracts.morden + +module.exports = { + displayName: 'Morden (Local)', + chainId: 2, + symbol: 'ETC', + + // contracts addresses + tokenPorterAddress: contracts.TokenPorter.address, + converterAddress: contracts.AutonomousConverter.address, + validatorAddress: contracts.Validator.address, + metTokenAddress: contracts.METToken.address, + auctionAddress: contracts.Auctions.address, + + // urls + explorerUrl: 'https://explorer.metronome.io', // TODO: update! + indexerUrl: 'http://localhost:3015', + metApiUrl: 'https://api.metronome.io/', // TODO: update! + wsApiUrl: 'ws://localhost:8556', + + // defauls + coinDefaultGasLimit: '21000', + metDefaultGasLimit: '250000', + defaultGasPrice: '1000000000', + maxGasPrice: '20000000000000000' +} diff --git a/public/config/ethMainnet.js b/public/config/ethMainnet.js index 5bfbde77..51512946 100644 --- a/public/config/ethMainnet.js +++ b/public/config/ethMainnet.js @@ -4,9 +4,9 @@ const MetronomeContracts = require('metronome-contracts') const contracts = MetronomeContracts.mainnet module.exports = { - displayName: 'Ethereum', // visible in select control + displayName: 'Ethereum', chainId: 1, - symbol: 'ETH', // visible next to amounts + symbol: 'ETH', // contracts addresses tokenPorterAddress: contracts.TokenPorter.address, diff --git a/public/config/ethRopsten.js b/public/config/ethRopsten.js new file mode 100644 index 00000000..ecccd38e --- /dev/null +++ b/public/config/ethRopsten.js @@ -0,0 +1,29 @@ +'use strict' + +const MetronomeContracts = require('metronome-contracts') +const contracts = MetronomeContracts.ropsten + +module.exports = { + displayName: 'ETH (Ropsten)', + chainId: 3, + symbol: 'ETH', + + // contracts addresses + tokenPorterAddress: contracts.TokenPorter.address, + converterAddress: contracts.AutonomousConverter.address, + validatorAddress: contracts.Validator.address, + metTokenAddress: contracts.METToken.address, + auctionAddress: contracts.Auctions.address, + + // urls + explorerUrl: 'https://explorer.metronome.io', // TODO: update! + indexerUrl: 'https://indexer.metronome.io', // TODO: update! + metApiUrl: 'https://api.metronome.io/', // TODO: update! + wsApiUrl: 'wss://eth.wallet.metronome.io:8546', // TODO: update! + + // defauls + coinDefaultGasLimit: '21000', + metDefaultGasLimit: '250000', + defaultGasPrice: '1000000000', + maxGasPrice: '20000000000000000' +} diff --git a/public/config/ethRopstenLocal.js b/public/config/ethRopstenLocal.js index d29cec27..f83e6409 100644 --- a/public/config/ethRopstenLocal.js +++ b/public/config/ethRopstenLocal.js @@ -4,9 +4,9 @@ const MetronomeContracts = require('metronome-contracts') const contracts = MetronomeContracts.ropsten module.exports = { - displayName: 'Ropsten (Local)', // visible in select control + displayName: 'Ropsten (Local)', chainId: 3, - symbol: 'ETH', // visible next to amounts + symbol: 'ETH', // contracts addresses tokenPorterAddress: contracts.TokenPorter.address, diff --git a/src/components/Loading.js b/src/components/Loading.js index 13f5c03a..51ced9cd 100644 --- a/src/components/Loading.js +++ b/src/components/Loading.js @@ -11,7 +11,6 @@ const ChecklistContainer = styled(Flex.Row)` ` const Title = styled.div` - display: none; // remove this line when reinserting ChainSelector font-weight: 600; font-size: 0.9rem; letter-spacing: 1.6px; @@ -21,7 +20,7 @@ const Title = styled.div` ` const Checklist = styled.div` - // padding-left: 4.8rem; // add this line when reinserting ChainSelector + padding-left: 4.8rem; ` class Loading extends React.Component { diff --git a/src/components/Router.js b/src/components/Router.js index 1f4f2afe..f1f4f10f 100644 --- a/src/components/Router.js +++ b/src/components/Router.js @@ -8,7 +8,7 @@ import Converter from './converter/Converter' import Sidebar from './sidebar/Sidebar' import Auction from './auction/Auction' import Tools from './tools/Tools' -// import Port from './port/Port' +import Port from './port/Port' const fadeIn = keyframes` from { @@ -50,7 +50,7 @@ export const layout = ( - {/* */} + diff --git a/src/components/dashboard/tx-list/Filter.js b/src/components/dashboard/tx-list/Filter.js index f1a91204..b3c74842 100644 --- a/src/components/dashboard/tx-list/Filter.js +++ b/src/components/dashboard/tx-list/Filter.js @@ -82,12 +82,12 @@ export default class Filter extends React.Component { > Converted - {/* this.props.onFilterChange('ported')} > Ported - */} + ) } diff --git a/src/components/sidebar/PrimaryNav.js b/src/components/sidebar/PrimaryNav.js index ae8c3f97..7d251d45 100644 --- a/src/components/sidebar/PrimaryNav.js +++ b/src/components/sidebar/PrimaryNav.js @@ -3,11 +3,11 @@ import PropTypes from 'prop-types' import styled from 'styled-components' import React from 'react' -// import FailedImportsBadge from './FailedImportsBadge' +import FailedImportsBadge from './FailedImportsBadge' import ConverterIcon from '../icons/ConverterIcon' import AuctionIcon from '../icons/AuctionIcon' import WalletIcon from '../icons/WalletIcon' -// import PortIcon from '../icons/PortIcon' +import PortIcon from '../icons/PortIcon' const Button = styled(NavLink)` display: flex; @@ -114,13 +114,13 @@ export default class PrimaryNav extends React.Component { - {/* */} + ) } diff --git a/src/components/sidebar/Sidebar.js b/src/components/sidebar/Sidebar.js index f15e0b0a..f95de4c2 100644 --- a/src/components/sidebar/Sidebar.js +++ b/src/components/sidebar/Sidebar.js @@ -1,7 +1,7 @@ import styled from 'styled-components' import React from 'react' -// import ChainSelector from './ChainSelector' +import ChainSelector from './ChainSelector' import SecondaryNav from './SecondaryNav' import PrimaryNav from './PrimaryNav' import LogoIcon from '../icons/LogoIcon' @@ -34,9 +34,7 @@ const Container = styled.div` ` const LogoLargeContainer = styled.div` - padding: 3.2rem 3.2rem 5.6rem; // remove this line when reinserting ChainSelector - height: 125px; // remove this line when reinserting ChainSelector - // padding: 2.4rem 2.4rem 2.8rem 2.4rem; // add this line when reinserting ChainSelector + padding: 2.4rem 2.4rem 2.8rem 2.4rem; display: none; flex-shrink: 0; @@ -46,9 +44,7 @@ const LogoLargeContainer = styled.div` ` const LogoSmallContainer = styled.div` - padding: 2.3rem 1.6rem; // remove this line when reinserting ChainSelector - height: 125px; // remove this line when reinserting ChainSelector - // padding: 2.3rem 1.6rem 3.2rem; // add this line when reinserting ChainSelector + padding: 2.3rem 1.6rem 3.2rem; display: block; flex-shrink: 0; @@ -57,17 +53,16 @@ const LogoSmallContainer = styled.div` } ` -// const ChainSelectorContainer = styled.div` -// margin: 0 0.8rem 2.4rem; +const ChainSelectorContainer = styled.div` + margin: 0 0.8rem 2.4rem; -// @media (min-width: 800px) { -// margin: 0 1.6rem 2.4rem; -// } -// ` + @media (min-width: 800px) { + margin: 0 1.6rem 2.4rem; + } +` const PrimaryNavContainer = styled.nav` flex-grow: 1; - margin-top: 5rem; // remove this line when reinserting ChainSelector ` const SecondaryNavContainer = styled.div` @@ -103,9 +98,9 @@ export default class Sidebar extends React.Component { - {/* + - */} + From 53b75d68bb175e8b839631efd16337d6d46b3956 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Tue, 12 Feb 2019 17:27:51 -0300 Subject: [PATCH 06/47] Hide port drawer if wallet has no more than one enabled chain --- package.json | 2 +- src/components/port/Port.js | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7be707d0..822d180d 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "lodash": "4.17.11", "metronome-contracts": "2.0.0", "metronome-wallet-core": "2.0.1", - "metronome-wallet-ui-logic": "2.1.0", + "metronome-wallet-ui-logic": "autonomoussoftware/metronome-wallet-ui-logic#port-reloaded", "nedb": "1.8.0", "p-timeout": "2.0.1", "qrcode.react": "0.7.2", diff --git a/src/components/port/Port.js b/src/components/port/Port.js index 6934986c..ca756ea0 100644 --- a/src/components/port/Port.js +++ b/src/components/port/Port.js @@ -101,6 +101,7 @@ const PortBtn = styled(Btn)` class Port extends React.Component { static propTypes = { portDisabledReason: PropTypes.string, + shouldRenderForm: PropTypes.bool.isRequired, pendingImports: PropTypes.arrayOf( PropTypes.shape({ destinationChain: PropTypes.string.isRequired, @@ -181,10 +182,12 @@ class Port extends React.Component { - + {this.props.shouldRenderForm && ( + + )} ) From cc7ab56aea693bcf61e2e8c210521ab369f5b3d5 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Wed, 13 Feb 2019 16:28:48 -0300 Subject: [PATCH 07/47] Fix logger imports and update electron-log to a version that actually logs to file --- package.json | 2 +- public/main/client/auth.js | 2 +- public/main/client/database.js | 2 +- public/main/client/handlers/no-core.js | 2 +- public/main/client/handlers/single-core.js | 2 +- public/main/client/index.js | 2 +- public/main/client/settings/index.js | 2 +- public/main/client/subscriptions/utils.js | 2 +- public/main/main-window.js | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 7be707d0..b1fb8ccf 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "electron-context-menu": "0.9.1", "electron-debug": "1.5.0", "electron-is-dev": "0.3.0", - "electron-log": "2.2.17", + "electron-log": "3.0.1", "electron-settings": "3.2.0", "electron-unhandled": "1.1.0", "electron-updater": "2.23.3", diff --git a/public/main/client/auth.js b/public/main/client/auth.js index 0202537d..9b93b22f 100644 --- a/public/main/client/auth.js +++ b/public/main/client/auth.js @@ -1,6 +1,6 @@ 'use strict' -const logger = require('electron-log') +const logger = require('../../logger.js') const { getPasswordHash, setPasswordHash } = require('./settings') const { diff --git a/public/main/client/database.js b/public/main/client/database.js index 40463b09..5ea61bb8 100644 --- a/public/main/client/database.js +++ b/public/main/client/database.js @@ -4,9 +4,9 @@ const { app } = require('electron') const { promisify } = require('util') const { sum, upperFirst } = require('lodash') const Datastore = require('nedb') -const logger = require('electron-log') const path = require('path') +const logger = require('../../logger') const config = require('../../config') const promisifyMethods = methods => diff --git a/public/main/client/handlers/no-core.js b/public/main/client/handlers/no-core.js index adbf844f..68af2766 100644 --- a/public/main/client/handlers/no-core.js +++ b/public/main/client/handlers/no-core.js @@ -2,7 +2,7 @@ const restart = require('../electron-restart') const dbManager = require('../database') -const logger = require('electron-log') +const logger = require('../../../logger') const storage = require('../storage') const auth = require('../auth') diff --git a/public/main/client/handlers/single-core.js b/public/main/client/handlers/single-core.js index e03b4a32..b41198c4 100644 --- a/public/main/client/handlers/single-core.js +++ b/public/main/client/handlers/single-core.js @@ -1,8 +1,8 @@ 'use strict' -const logger = require('electron-log') const pTimeout = require('p-timeout') +const logger = require('../../../logger') const auth = require('../auth') const config = require('../../../config') const wallet = require('../wallet') diff --git a/public/main/client/index.js b/public/main/client/index.js index a02b87f2..f001bb20 100644 --- a/public/main/client/index.js +++ b/public/main/client/index.js @@ -2,9 +2,9 @@ const { ipcMain } = require('electron') const createCore = require('metronome-wallet-core') -const logger = require('electron-log') const stringify = require('json-stringify-safe') +const logger = require('../../logger') const subscriptions = require('./subscriptions') const settings = require('./settings') const storage = require('./storage') diff --git a/public/main/client/settings/index.js b/public/main/client/settings/index.js index cce79626..ef593269 100644 --- a/public/main/client/settings/index.js +++ b/public/main/client/settings/index.js @@ -1,10 +1,10 @@ 'use strict' -const logger = require('electron-log') const settings = require('electron-settings') const utils = require('web3-utils') const { merge } = require('lodash') +const logger = require('../../../logger') const restart = require('../electron-restart') const { getDb } = require('../database') diff --git a/public/main/client/subscriptions/utils.js b/public/main/client/subscriptions/utils.js index c22ba76e..f4e92f30 100644 --- a/public/main/client/subscriptions/utils.js +++ b/public/main/client/subscriptions/utils.js @@ -1,9 +1,9 @@ 'use strict' const { ipcMain } = require('electron') -const logger = require('electron-log') const stringify = require('json-stringify-safe') +const logger = require('../../../logger') const WalletError = require('../WalletError') function getLogData (data) { diff --git a/public/main/main-window.js b/public/main/main-window.js index c283259f..dedb76c5 100644 --- a/public/main/main-window.js +++ b/public/main/main-window.js @@ -3,10 +3,10 @@ const { app, BrowserWindow, Notification } = require('electron') const { autoUpdater } = require('electron-updater') const isDev = require('electron-is-dev') -const logger = require('electron-log') const path = require('path') const windowStateKeeper = require('electron-window-state') +const logger = require('../logger') const analytics = require('../analytics') const restart = require('./client/electron-restart') From 4863e7968f5c64f2e6038e156dd2fb8a50d12e5a Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Thu, 14 Feb 2019 17:43:04 -0300 Subject: [PATCH 08/47] Subscribe core handlers to multiple instances --- public/main/client/subscriptions/index.js | 4 ++-- public/main/client/subscriptions/single-core.js | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/public/main/client/subscriptions/index.js b/public/main/client/subscriptions/index.js index 9e24e7bc..37a64cdd 100644 --- a/public/main/client/subscriptions/index.js +++ b/public/main/client/subscriptions/index.js @@ -10,9 +10,9 @@ function subscribe (cores) { subscribeWithoutCore() } -function unsubscribe () { +function unsubscribe (cores) { + cores.forEach(unsubscribeSingleCore) unsubscribeMultiCore() - unsubscribeSingleCore() unsubscribeWithoutCore() } diff --git a/public/main/client/subscriptions/single-core.js b/public/main/client/subscriptions/single-core.js index 5615e091..1b1aac15 100644 --- a/public/main/client/subscriptions/single-core.js +++ b/public/main/client/subscriptions/single-core.js @@ -23,16 +23,19 @@ const listeners = { 'send-met': handlers.sendMet } +const coreListeners = {} + // Subscribe to messages where only one particular core has to react function subscribeSingleCore (core) { + coreListeners[core.chain] = {} Object.keys(listeners).forEach(function (key) { - listeners[key] = withCore(core)(listeners[key]) + coreListeners[core.chain][key] = withCore(core)(listeners[key]) }) - utils.subscribeTo(listeners, core.chain) + utils.subscribeTo(coreListeners[core.chain], core.chain) } -const unsubscribeSingleCore = () => - utils.unsubscribeTo(listeners) +const unsubscribeSingleCore = core => + utils.unsubscribeTo(coreListeners[core.chain]) module.exports = { subscribeSingleCore, unsubscribeSingleCore } From 7b961c7e6eabe4682ceb6f27c62135bacd425c35 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Thu, 14 Feb 2019 18:02:26 -0300 Subject: [PATCH 09/47] Refactor Explorer link click handler --- src/components/common/receipt/Receipt.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/common/receipt/Receipt.js b/src/components/common/receipt/Receipt.js index 31f160ce..62df7735 100644 --- a/src/components/common/receipt/Receipt.js +++ b/src/components/common/receipt/Receipt.js @@ -184,10 +184,7 @@ export default class Receipt extends React.Component { )} - this.props.onExplorerLinkClick(tx.hash)} - block - > + VIEW IN EXPLORER From 89a50368662d810a4965d936e5e5fc53825099fd Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Thu, 14 Feb 2019 18:48:59 -0300 Subject: [PATCH 10/47] Implement explorer URL template in config --- public/config/etcMorden.js | 2 +- public/config/etcMordenLocal.js | 2 +- public/config/ethMainnet.js | 2 +- public/config/ethRopsten.js | 2 +- public/config/ethRopstenLocal.js | 2 +- src/client/index.js | 7 ++----- 6 files changed, 7 insertions(+), 10 deletions(-) diff --git a/public/config/etcMorden.js b/public/config/etcMorden.js index e30f1200..26d5babe 100644 --- a/public/config/etcMorden.js +++ b/public/config/etcMorden.js @@ -16,7 +16,7 @@ module.exports = { auctionAddress: contracts.Auctions.address, // urls - explorerUrl: 'https://explorer.metronome.io', // TODO: update! + explorerUrl: 'https://mordenexplorer.ethertrack.io/tx/{{hash}}', indexerUrl: 'https://indexer.metronome.io', // TODO: update! metApiUrl: 'https://api.metronome.io/', // TODO: update! wsApiUrl: 'wss://eth.wallet.metronome.io:8546', // TODO: update! diff --git a/public/config/etcMordenLocal.js b/public/config/etcMordenLocal.js index 64e7f7a3..c784b1b5 100644 --- a/public/config/etcMordenLocal.js +++ b/public/config/etcMordenLocal.js @@ -16,7 +16,7 @@ module.exports = { auctionAddress: contracts.Auctions.address, // urls - explorerUrl: 'https://explorer.metronome.io', // TODO: update! + explorerUrl: 'https://mordenexplorer.ethertrack.io/tx/{{hash}}', indexerUrl: 'http://localhost:3015', metApiUrl: 'https://api.metronome.io/', // TODO: update! wsApiUrl: 'ws://localhost:8556', diff --git a/public/config/ethMainnet.js b/public/config/ethMainnet.js index 51512946..74fbc1f2 100644 --- a/public/config/ethMainnet.js +++ b/public/config/ethMainnet.js @@ -16,7 +16,7 @@ module.exports = { auctionAddress: contracts.Auctions.address, // urls - explorerUrl: 'https://explorer.metronome.io', + explorerUrl: 'https://etherscan.io/tx/{{hash}}', indexerUrl: 'https://indexer.metronome.io', metApiUrl: 'https://api.metronome.io/', wsApiUrl: 'wss://eth.wallet.metronome.io:8546', diff --git a/public/config/ethRopsten.js b/public/config/ethRopsten.js index ecccd38e..5823105b 100644 --- a/public/config/ethRopsten.js +++ b/public/config/ethRopsten.js @@ -16,7 +16,7 @@ module.exports = { auctionAddress: contracts.Auctions.address, // urls - explorerUrl: 'https://explorer.metronome.io', // TODO: update! + explorerUrl: 'https://ropsten.etherscan.io/tx/{{hash}}', indexerUrl: 'https://indexer.metronome.io', // TODO: update! metApiUrl: 'https://api.metronome.io/', // TODO: update! wsApiUrl: 'wss://eth.wallet.metronome.io:8546', // TODO: update! diff --git a/public/config/ethRopstenLocal.js b/public/config/ethRopstenLocal.js index f83e6409..1923e18e 100644 --- a/public/config/ethRopstenLocal.js +++ b/public/config/ethRopstenLocal.js @@ -16,7 +16,7 @@ module.exports = { auctionAddress: contracts.Auctions.address, // urls - explorerUrl: 'http://localhost:3004', + explorerUrl: 'https://ropsten.etherscan.io/tx/{{hash}}', indexerUrl: 'http://localhost:3005', metApiUrl: 'http://localhost:3002/', wsApiUrl: 'ws://localhost:8546', diff --git a/src/client/index.js b/src/client/index.js index 0a65fb27..1157f2e1 100644 --- a/src/client/index.js +++ b/src/client/index.js @@ -38,10 +38,7 @@ function createClient(createStore) { 'https://github.com/autonomoussoftware/documentation/blob/master/FAQ.md#metronome-faq' ) - const onExplorerLinkClick = transactionHash => - window.openLink( - `https://explorer.metronome.io/transactions/${transactionHash}` - ) + const onLinkClick = url => window.openLink(url) const getStringEntropy = fastPasswordEntropy @@ -111,12 +108,12 @@ function createClient(createStore) { ...forwardedMethods, isValidMnemonic: keys.isValidMnemonic, createMnemonic: keys.createMnemonic, - onExplorerLinkClick, onTermsLinkClick, getStringEntropy, copyToClipboard, onHelpLinkClick, getAppVersion: window.getAppVersion, + onLinkClick, onInit, store } From 9b5ed6b463e4b3ef74f9f5abfda9b8191d9eec9f Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Thu, 14 Feb 2019 18:49:47 -0300 Subject: [PATCH 11/47] Avoid launching web3-connection-related toasts when changing chains --- src/components/Web3ConnectionNotifier.js | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/components/Web3ConnectionNotifier.js b/src/components/Web3ConnectionNotifier.js index 04d66763..203cb934 100644 --- a/src/components/Web3ConnectionNotifier.js +++ b/src/components/Web3ConnectionNotifier.js @@ -1,5 +1,4 @@ -import * as selectors from 'metronome-wallet-ui-logic/src/selectors' -import { connect } from 'react-redux' +import withConnectionState from 'metronome-wallet-ui-logic/src/hocs/withConnectionState' import PropTypes from 'prop-types' import React from 'react' @@ -14,7 +13,10 @@ class Web3ConnectionNotifier extends React.Component { static contextType = ToastsContext componentDidUpdate(prevProps) { - // Only lauch success toast when recovering from a disconnection + // Avoid launching toasts when changing chains + if (prevProps.chainName !== this.props.chainName) return + + // Only launch success toast when recovering from a disconnection if (prevProps.isConnected === false && this.props.isConnected === true) { this.context.toast( 'success', @@ -39,20 +41,8 @@ class Web3ConnectionNotifier extends React.Component { } } -const mapStateToProps = state => ({ - // default to null until initial state is received - isConnected: state.chains.active - ? selectors.getChainConnectionStatus(state) - : null, - - // default to null until initial state is received - chainName: state.chains.active - ? selectors.getActiveChainDisplayName(state) - : null -}) - // We have to do this indirection because React 16.7.0 doesn't support using // both contextType and Redux context at the same time -export default connect(mapStateToProps)(({ isConnected, chainName }) => ( +export default withConnectionState(({ isConnected, chainName }) => ( )) From bf26d8cff0316bbc8ba501d3a99b6efdacbc915f Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Thu, 14 Feb 2019 23:13:45 -0300 Subject: [PATCH 12/47] Update local Morden config --- public/config/etcMordenLocal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/config/etcMordenLocal.js b/public/config/etcMordenLocal.js index c784b1b5..31fb9291 100644 --- a/public/config/etcMordenLocal.js +++ b/public/config/etcMordenLocal.js @@ -18,7 +18,7 @@ module.exports = { // urls explorerUrl: 'https://mordenexplorer.ethertrack.io/tx/{{hash}}', indexerUrl: 'http://localhost:3015', - metApiUrl: 'https://api.metronome.io/', // TODO: update! + metApiUrl: 'http://localhost:3012/', wsApiUrl: 'ws://localhost:8556', // defauls From 2cd427eeea8e8f8400a73a340d54d5d70450e11a Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Thu, 14 Feb 2019 23:14:06 -0300 Subject: [PATCH 13/47] Patch web3 to allow sending txs in ETC --- patches/web3-eth-accounts+1.0.0-beta.37.patch | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 patches/web3-eth-accounts+1.0.0-beta.37.patch diff --git a/patches/web3-eth-accounts+1.0.0-beta.37.patch b/patches/web3-eth-accounts+1.0.0-beta.37.patch new file mode 100644 index 00000000..50026a13 --- /dev/null +++ b/patches/web3-eth-accounts+1.0.0-beta.37.patch @@ -0,0 +1,15 @@ +patch-package +--- a/node_modules/web3-eth-accounts/src/index.js ++++ b/node_modules/web3-eth-accounts/src/index.js +@@ -69,9 +69,8 @@ var Accounts = function Accounts() { + var _ethereumCall = [ + new Method({ + name: 'getId', +- call: 'net_version', +- params: 0, +- outputFormatter: utils.hexToNumber ++ call: 'eth_chainId', ++ params: 0 + }), + new Method({ + name: 'getGasPrice', From 86cdfe4b883d3ef0e896dedeef95e4397934dd8a Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Fri, 15 Feb 2019 11:07:49 -0300 Subject: [PATCH 14/47] Start core after sending ui-ready response to renderer process --- public/main/client/index.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/public/main/client/index.js b/public/main/client/index.js index a02b87f2..1e2e2505 100644 --- a/public/main/client/index.js +++ b/public/main/client/index.js @@ -107,15 +107,6 @@ function createClient (config) { })) ipcMain.on('ui-ready', function (webContent, args) { - cores.forEach(function (core) { - const { emitter, events, coreApi } = startCore(core, webContent) - core.emitter = emitter - core.events = events - core.coreApi = coreApi - }) - - subscriptions.subscribe(cores) - const onboardingComplete = !!settings.getPasswordHash() storage.getState() .catch(function (err) { @@ -136,6 +127,18 @@ function createClient (config) { .catch(function (err) { logger.error('Could not send ui-ready message back', err.message) }) + .then(function () { + cores.forEach(function (core) { + const { emitter, events, coreApi } = startCore(core, webContent) + core.emitter = emitter + core.events = events + core.coreApi = coreApi + }) + subscriptions.subscribe(cores) + }) + .catch(function (err) { + logger.error('Could not start cores', err.message) + }) }) ipcMain.on('ui-unload', function () { From 782504a573824d398927a862ccc1e6241d2fa879 Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Fri, 15 Feb 2019 11:55:13 -0300 Subject: [PATCH 15/47] Simplify the chainId patch --- patches/web3-eth-accounts+1.0.0-beta.37.patch | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/patches/web3-eth-accounts+1.0.0-beta.37.patch b/patches/web3-eth-accounts+1.0.0-beta.37.patch index 50026a13..d6b789e5 100644 --- a/patches/web3-eth-accounts+1.0.0-beta.37.patch +++ b/patches/web3-eth-accounts+1.0.0-beta.37.patch @@ -1,15 +1,12 @@ patch-package --- a/node_modules/web3-eth-accounts/src/index.js +++ b/node_modules/web3-eth-accounts/src/index.js -@@ -69,9 +69,8 @@ var Accounts = function Accounts() { +@@ -69,7 +69,7 @@ var Accounts = function Accounts() { var _ethereumCall = [ new Method({ name: 'getId', - call: 'net_version', -- params: 0, -- outputFormatter: utils.hexToNumber + call: 'eth_chainId', -+ params: 0 + params: 0, + outputFormatter: utils.hexToNumber }), - new Method({ - name: 'getGasPrice', From 1954f14c12dd71c1ac556b8eb74cb3959b425310 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Fri, 15 Feb 2019 14:10:36 -0300 Subject: [PATCH 16/47] Minor styling tweaks --- src/components/auction/Auction.js | 11 ++++++++-- src/components/auction/Stats.js | 6 +++++- src/components/converter/Converter.js | 11 ++++++++-- src/components/converter/Stats.js | 6 +++++- src/components/tools/WalletStatus.js | 30 +++++++++++++-------------- 5 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/components/auction/Auction.js b/src/components/auction/Auction.js index 9b505f6d..16babcb5 100644 --- a/src/components/auction/Auction.js +++ b/src/components/auction/Auction.js @@ -47,6 +47,13 @@ const BuyBtn = styled(Btn)` } ` +const LastUpdatedContainer = styled.div` + padding: 0 2.4rem 3.2rem; + @media (min-width: 800px) { + padding: 0 4.8rem 3.2rem; + } +` + class Auction extends React.Component { static propTypes = { countdownTargetTimestamp: PropTypes.number, @@ -108,9 +115,9 @@ class Auction extends React.Component { )} - + - + ) } diff --git a/src/components/auction/Stats.js b/src/components/auction/Stats.js index b873b4d0..e244b123 100644 --- a/src/components/auction/Stats.js +++ b/src/components/auction/Stats.js @@ -19,10 +19,14 @@ const Container = styled.div` const Label = styled.div` line-height: 4rem; - font-size: 2.4rem; + font-size: 1.6rem; text-shadow: 0 1px 1px ${p => p.theme.colors.darkShade}; margin-right: 1.6rem; white-space: nowrap; + + @media (min-width: 1100px) { + font-size: 2.4rem; + } ` const Badge = styled.div` diff --git a/src/components/converter/Converter.js b/src/components/converter/Converter.js index 4f7bb1f7..4d69b96e 100644 --- a/src/components/converter/Converter.js +++ b/src/components/converter/Converter.js @@ -36,6 +36,13 @@ const LoadingContainer = styled.div` margin: 0 auto; ` +const LastUpdatedContainer = styled.div` + padding: 0 2.4rem 3.2rem; + @media (min-width: 1180px) { + padding: 0 4.8rem 3.2rem; + } +` + class Converter extends React.Component { static propTypes = { convertDisabledReason: PropTypes.string, @@ -95,9 +102,9 @@ class Converter extends React.Component { )} - + - + ) } diff --git a/src/components/converter/Stats.js b/src/components/converter/Stats.js index 623739bb..eced8f0d 100644 --- a/src/components/converter/Stats.js +++ b/src/components/converter/Stats.js @@ -19,10 +19,14 @@ const Container = styled.div` const Label = styled.div` line-height: 4rem; - font-size: 2.4rem; + font-size: 1.6rem; text-shadow: 0 1px 1px ${p => p.theme.colors.darkShade}; margin-right: 2em; white-space: nowrap; + + @media (min-width: 920px) { + font-size: 2.4rem; + } ` const Badge = styled.div` diff --git a/src/components/tools/WalletStatus.js b/src/components/tools/WalletStatus.js index a86684f4..cafdefc4 100644 --- a/src/components/tools/WalletStatus.js +++ b/src/components/tools/WalletStatus.js @@ -37,21 +37,21 @@ function WalletStatus(props) { return (
Version {props.appVersion} - - Connected to {props.chainName} chain - - ( - - Best Block {props.height} - - mined {timeAgo} - - - )} - /> - + + Connected to {props.chainName} chain + + ( + + Best Block {props.height} + + mined {timeAgo} + + + )} + /> + Date: Fri, 15 Feb 2019 14:36:22 -0300 Subject: [PATCH 17/47] Fix unhandled Promise rejection in state persistance --- src/client/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/client/index.js b/src/client/index.js index 1157f2e1..a8730db4 100644 --- a/src/client/index.js +++ b/src/client/index.js @@ -20,7 +20,12 @@ function createClient(createStore) { store.subscribe( debounce( function() { - utils.forwardToMainProcess('persist-state')(store.getState()) + utils + .forwardToMainProcess('persist-state')(store.getState()) + .catch(err => + // eslint-disable-next-line no-console + console.warn(`Error persisting state: ${err.message}`) + ) }, debounceTime, { maxWait: 2 * debounceTime } From 29c72fbb7ae1283c161d5e6f4b02d34e6c7dca39 Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Fri, 15 Feb 2019 14:36:48 -0300 Subject: [PATCH 18/47] Patch tx status parsing in Web3 --- patches/web3-core-method+1.0.0-beta.37.patch | 21 +++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/patches/web3-core-method+1.0.0-beta.37.patch b/patches/web3-core-method+1.0.0-beta.37.patch index 7de327a9..4e306a76 100644 --- a/patches/web3-core-method+1.0.0-beta.37.patch +++ b/patches/web3-core-method+1.0.0-beta.37.patch @@ -1,7 +1,26 @@ patch-package --- a/node_modules/web3-core-method/src/index.js +++ b/node_modules/web3-core-method/src/index.js -@@ -533,7 +533,16 @@ Method.prototype.buildCall = function() { +@@ -200,6 +200,7 @@ Method.prototype._confirmTransaction = function (defer, result, payload) { + intervalId = null, + receiptJSON = '', + gasProvided = (_.isObject(payload.params[0]) && payload.params[0].gas) ? payload.params[0].gas : null, ++ isContractCall = _.isObject(payload.params[0]) && !!payload.params[0].data, + isContractDeployment = _.isObject(payload.params[0]) && + payload.params[0].data && + payload.params[0].from && +@@ -348,8 +349,8 @@ Method.prototype._confirmTransaction = function (defer, result, payload) { + if (!isContractDeployment && !promiseResolved) { + + if(!receipt.outOfGas && +- (!gasProvided || gasProvided !== receipt.gasUsed) && +- (receipt.status === true || receipt.status === '0x1' || typeof receipt.status === 'undefined')) { ++ (!gasProvided || gasProvided !== utils.numberToHex(receipt.gasUsed) || !isContractCall || (isContractCall && receipt.events)) && ++ (receipt.status === true || receipt.status === '0x1' || receipt.status === null || typeof receipt.status === 'undefined')) { + defer.eventEmitter.emit('receipt', receipt); + defer.resolve(receipt); + +@@ -533,7 +534,16 @@ Method.prototype.buildCall = function() { // If wallet was found, sign tx, and send using sendRawTransaction if (wallet && wallet.privateKey) { From a5676bc3a445d92a9c2cf5b8924a7e25045c6a42 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Fri, 15 Feb 2019 15:22:57 -0300 Subject: [PATCH 19/47] Adjust Port screen for smaller windows --- src/components/port/Port.js | 88 ++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 35 deletions(-) diff --git a/src/components/port/Port.js b/src/components/port/Port.js index ca756ea0..992acc12 100644 --- a/src/components/port/Port.js +++ b/src/components/port/Port.js @@ -10,8 +10,13 @@ import PortDrawer from './PortDrawer' const Container = styled.div` display: flex; padding: 3.2rem 4.8rem; - align-items: flex-start; - flex-direction: row; + align-items: stretch; + flex-direction: column; + + @media (min-width: 1000px) { + align-items: flex-start; + flex-direction: row; + } ` const Title = styled.h2` @@ -90,8 +95,17 @@ const Details = styled.div` ` const BtnContainer = styled.div` - margin-top: 5rem; - margin-left: 2.4rem; + margin-bottom: 3.2rem; + order: -1; + align-self: center; + + @media (min-width: 1000px) { + margin-top: 5rem; + margin-left: 2.4rem; + margin-bottom: 0; + order: 0; + align-self: flex-start; + } ` const PortBtn = styled(Btn)` @@ -130,30 +144,34 @@ class Port extends React.Component { - Pending Imports - - {this.props.pendingImports.map(item => ( - - - - - {item.validations}/{item.totalValidators} - {' '} - VALIDATIONS - - - - - -
- IMPORTING FROM {item.originChain} to{' '} - {item.destinationChain} -
-
-
-
- ))} -
+ {this.props.pendingImports.length > 0 && ( + + Pending Imports + + {this.props.pendingImports.map(item => ( + + + + + {item.validations}/{item.totalValidators} + {' '} + VALIDATIONS + + + + + +
+ IMPORTING FROM {item.originChain} to{' '} + {item.destinationChain} +
+
+
+
+ ))} +
+
+ )} {this.props.failedImports.length > 0 && (
Failed Imports @@ -181,14 +199,14 @@ class Port extends React.Component { New Port - - {this.props.shouldRenderForm && ( - - )} + + {this.props.shouldRenderForm && ( + + )} ) } From 1d0d015f1390a022d4fca6ba6a4a673e3c5d42f9 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Fri, 15 Feb 2019 17:00:30 -0300 Subject: [PATCH 20/47] Implement subscription to retry-import message --- public/main/client/handlers/single-core.js | 5 ----- public/main/client/subscriptions/single-core.js | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/public/main/client/handlers/single-core.js b/public/main/client/handlers/single-core.js index e03b4a32..27289dcc 100644 --- a/public/main/client/handlers/single-core.js +++ b/public/main/client/handlers/single-core.js @@ -133,10 +133,6 @@ const exportMetronome = (data, core) => const importMetronome = (data, core) => withAuth(core.coreApi.metronome.importMet)(data, core) -// TODO: Implement retry method -// eslint-disable-next-line no-unused-vars -const retryImport = (data, core) => Promise.resolve({}) - module.exports = { refreshAllTransactions, getConvertCoinEstimate, @@ -156,7 +152,6 @@ module.exports = { getGasLimit, getGasPrice, convertCoin, - retryImport, convertMet, openWallet, sendMet, diff --git a/public/main/client/subscriptions/single-core.js b/public/main/client/subscriptions/single-core.js index 1b1aac15..b86c026d 100644 --- a/public/main/client/subscriptions/single-core.js +++ b/public/main/client/subscriptions/single-core.js @@ -14,6 +14,7 @@ const listeners = { 'get-auction-gas-limit': handlers.getAuctionGasLimit, 'get-tokens-gas-limit': handlers.getTokensGasLimit, 'refresh-transaction': handlers.refreshTransaction, + 'retry-import': handlers.importMetronome, 'buy-metronome': handlers.buyMetronome, 'get-gas-limit': handlers.getGasLimit, 'get-gas-price': handlers.getGasPrice, From 977d9f5b5da74d730aff31fe4df2c9e7e9631a80 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Fri, 15 Feb 2019 22:29:20 -0300 Subject: [PATCH 21/47] Implement request password for Retry Import Also: - style adjustments for "Import Requested" type transactions in list - parse "import-requested" type transactions metadata TO DO: Implement some decent design for preview retry screen --- src/client/index.js | 1 + src/components/common/receipt/AmountRow.js | 3 + src/components/common/receipt/Receipt.js | 55 +++++--- src/components/common/receipt/TypeRow.js | 6 +- src/components/dashboard/tx-list/TxList.js | 4 +- .../dashboard/tx-list/row/Amount.js | 6 +- .../dashboard/tx-list/row/Details.js | 4 + src/components/dashboard/tx-list/row/Icon.js | 2 + .../tx-list/row/ImportRequestedDetails.js | 30 +++++ src/components/port/FailedImports.js | 27 ++-- src/components/port/Port.js | 29 ++++- src/components/port/RetryImportDrawer.js | 117 ++++++++++++++++++ 12 files changed, 250 insertions(+), 34 deletions(-) create mode 100644 src/components/dashboard/tx-list/row/ImportRequestedDetails.js create mode 100644 src/components/port/RetryImportDrawer.js diff --git a/src/client/index.js b/src/client/index.js index a8730db4..727e5372 100644 --- a/src/client/index.js +++ b/src/client/index.js @@ -92,6 +92,7 @@ function createClient(createStore) { onOnboardingCompleted: utils.forwardToMainProcess('onboarding-completed'), recoverFromMnemonic: utils.forwardToMainProcess('recover-from-mnemonic'), getAuctionGasLimit: utils.forwardToMainProcess('get-auction-gas-limit'), + getImportGasLimit: utils.forwardToMainProcess('get-import-gas-limit'), getTokensGasLimit: utils.forwardToMainProcess('get-tokens-gas-limit'), portMetronome: utils.forwardToMainProcess('port-metronome', 750000), validatePassword: utils.forwardToMainProcess('validate-password'), diff --git a/src/components/common/receipt/AmountRow.js b/src/components/common/receipt/AmountRow.js index 52e883f4..eba4fec6 100644 --- a/src/components/common/receipt/AmountRow.js +++ b/src/components/common/receipt/AmountRow.js @@ -39,6 +39,7 @@ export default class AmountRow extends React.Component { fromValue: PropTypes.string, toValue: PropTypes.string, txType: PropTypes.oneOf([ + 'import-requested', 'converted', 'exported', 'imported', @@ -51,6 +52,7 @@ export default class AmountRow extends React.Component { value: PropTypes.string } + // eslint-disable-next-line complexity render() { return ( @@ -105,6 +107,7 @@ export default class AmountRow extends React.Component { maxSize="2rem" value={this.props.value} post={ + this.props.txType === 'import-requested' || this.props.txType === 'imported' || this.props.txType === 'exported' ? ' MET' diff --git a/src/components/common/receipt/Receipt.js b/src/components/common/receipt/Receipt.js index 62df7735..4bb78c01 100644 --- a/src/components/common/receipt/Receipt.js +++ b/src/components/common/receipt/Receipt.js @@ -114,14 +114,17 @@ export default class Receipt extends React.Component { - {tx.txType === 'exported' && tx.portFee && ( - - - - - - - )} + {(tx.txType === 'import-requested' || + tx.txType === 'imported' || + tx.txType === 'exported') && + tx.portFee && ( + + + + + + + )} {tx.txType === 'received' && tx.from && ( @@ -146,6 +149,27 @@ export default class Receipt extends React.Component { )} + {tx.txType === 'import-requested' && tx.importedFrom && ( + + + {tx.importedFrom} blockchain + + )} + + {tx.txType === 'imported' && tx.importedFrom && ( + + + {tx.importedFrom} blockchain + + )} + {tx.portDestinationAddress && ( @@ -158,12 +182,15 @@ export default class Receipt extends React.Component { {this.props.confirmations} - {tx.txType === 'exported' && tx.portBurnHash && ( - - - {tx.portBurnHash} - - )} + {(tx.txType === 'import-requested' || + tx.txType === 'imported' || + tx.txType === 'exported') && + tx.portBurnHash && ( + + + {tx.portBurnHash} + + )} {tx.gasUsed && ( diff --git a/src/components/common/receipt/TypeRow.js b/src/components/common/receipt/TypeRow.js index 73f86771..d8643e0c 100644 --- a/src/components/common/receipt/TypeRow.js +++ b/src/components/common/receipt/TypeRow.js @@ -38,8 +38,10 @@ export default class TypeRow extends React.Component { {this.props.isCancelApproval ? 'Allowance canceled' : this.props.isApproval - ? 'Allowance set' - : this.props.txType} + ? 'Allowance set' + : this.props.txType === 'import-requested' + ? 'Import Request' + : this.props.txType} ) diff --git a/src/components/dashboard/tx-list/TxList.js b/src/components/dashboard/tx-list/TxList.js index e17cb0c9..76eb5b41 100644 --- a/src/components/dashboard/tx-list/TxList.js +++ b/src/components/dashboard/tx-list/TxList.js @@ -91,7 +91,9 @@ class TxList extends React.Component { ) filterExtractValue = ({ txType }) => - ['imported', 'exported'].includes(txType) ? 'ported' : txType + ['import-requested', 'imported', 'exported'].includes(txType) + ? 'ported' + : txType render() { if (!this.state.isReady) return null diff --git a/src/components/dashboard/tx-list/row/Amount.js b/src/components/dashboard/tx-list/row/Amount.js index f70168df..520e5bc7 100644 --- a/src/components/dashboard/tx-list/row/Amount.js +++ b/src/components/dashboard/tx-list/row/Amount.js @@ -14,8 +14,8 @@ const Container = styled.div` p.isPending ? p.theme.colors.copy : p.isFailed - ? p.theme.colors.danger - : p.theme.colors.primary}; + ? p.theme.colors.danger + : p.theme.colors.primary}; display: flex; justify-content: flex-end; font-size: 2.3vw; @@ -40,6 +40,7 @@ export default class Amount extends React.Component { isFailed: PropTypes.bool.isRequired, symbol: PropTypes.string, txType: PropTypes.oneOf([ + 'import-requested', 'converted', 'imported', 'exported', @@ -67,6 +68,7 @@ export default class Amount extends React.Component { ) : this.props.txType === 'converted' ? ( + ) : this.props.txType === 'import-requested' ? ( + ) : this.props.txType === 'imported' ? ( ) : this.props.txType === 'exported' ? ( diff --git a/src/components/dashboard/tx-list/row/Icon.js b/src/components/dashboard/tx-list/row/Icon.js index fc37786f..f0423215 100644 --- a/src/components/dashboard/tx-list/row/Icon.js +++ b/src/components/dashboard/tx-list/row/Icon.js @@ -26,6 +26,7 @@ export default class Icon extends React.Component { isPending: PropTypes.bool.isRequired, isFailed: PropTypes.bool.isRequired, txType: PropTypes.oneOf([ + 'import-requested', 'converted', 'received', 'imported', @@ -50,6 +51,7 @@ export default class Icon extends React.Component { return case 'auction': return + case 'import-requested': case 'imported': return case 'exported': diff --git a/src/components/dashboard/tx-list/row/ImportRequestedDetails.js b/src/components/dashboard/tx-list/row/ImportRequestedDetails.js new file mode 100644 index 00000000..65f30953 --- /dev/null +++ b/src/components/dashboard/tx-list/row/ImportRequestedDetails.js @@ -0,0 +1,30 @@ +import PropTypes from 'prop-types' +import styled from 'styled-components' +import React from 'react' + +const Chain = styled.span` + line-height: 1.6rem; + font-size: 1.3rem; + font-weight: 600; +` + +export default class ImportRequestedDetails extends React.Component { + static propTypes = { + importedFrom: PropTypes.string, + isPending: PropTypes.bool.isRequired + } + + render() { + return this.props.isPending ? ( +
+ Pending import request from {this.props.importedFrom}{' '} + blockchain +
+ ) : ( +
+ Import from {this.props.importedFrom} blockchain + requested +
+ ) + } +} diff --git a/src/components/port/FailedImports.js b/src/components/port/FailedImports.js index 65a30eb4..6ed911cb 100644 --- a/src/components/port/FailedImports.js +++ b/src/components/port/FailedImports.js @@ -68,40 +68,45 @@ const RetryBtn = styled(Btn)` export default class FailedImports extends React.Component { static propTypes = { + retryDisabledReason: PropTypes.string, + retryDisabled: PropTypes.bool.isRequired, + onRetryClick: PropTypes.func.isRequired, items: PropTypes.arrayOf( PropTypes.shape({ + currentBurnHash: PropTypes.string.isRequired, originChain: PropTypes.string.isRequired, - receipt: PropTypes.shape({}), - meta: PropTypes.shape({ - currentBurnHash: PropTypes.string.isRequired, - value: PropTypes.string.isRequired - }) + value: PropTypes.string.isRequired, + from: PropTypes.string.isRequired }) - ).isRequired, - onRetry: PropTypes.func.isRequired + ).isRequired } - handleRetryClick = e => this.props.onRetry(e.target.dataset.hash) + handleRetryClick = e => this.props.onRetryClick(e.target.dataset.hash) render() { return ( {this.props.items.map(item => ( - + FAILED - +
EXPORTED FROM {item.originChain}
Retry diff --git a/src/components/port/Port.js b/src/components/port/Port.js index 992acc12..27d3ca18 100644 --- a/src/components/port/Port.js +++ b/src/components/port/Port.js @@ -4,6 +4,7 @@ import styled from 'styled-components' import React from 'react' import { DarkLayout, DisplayValue, Flex, Btn } from '../common' +import RetryImportDrawer from './RetryImportDrawer' import FailedImports from './FailedImports' import PortDrawer from './PortDrawer' @@ -114,6 +115,7 @@ const PortBtn = styled(Btn)` class Port extends React.Component { static propTypes = { + retryDisabledReason: PropTypes.string, portDisabledReason: PropTypes.string, shouldRenderForm: PropTypes.bool.isRequired, pendingImports: PropTypes.arrayOf( @@ -127,17 +129,26 @@ class Port extends React.Component { }) ).isRequired, failedImports: PropTypes.array.isRequired, - portDisabled: PropTypes.bool.isRequired, - onRetry: PropTypes.func.isRequired + retryDisabled: PropTypes.bool.isRequired, + portDisabled: PropTypes.bool.isRequired } state = { + retryCandidate: null, activeModal: null } onOpenModal = e => this.setState({ activeModal: e.target.dataset.modal }) - onCloseModal = () => this.setState({ activeModal: null }) + onCloseModal = () => + this.setState({ activeModal: null, retryCandidate: null }) + + onRetryClick = hash => { + const retryCandidate = this.props.failedImports.find( + ({ currentBurnHash }) => currentBurnHash === hash + ) + this.setState({ activeModal: 'retry-import', retryCandidate }) + } render() { return ( @@ -180,7 +191,9 @@ class Port extends React.Component { clicking Retry.
@@ -207,6 +220,14 @@ class Port extends React.Component { isOpen={this.state.activeModal === 'port'} /> )} + + {this.props.shouldRenderForm && ( + + )}
) } diff --git a/src/components/port/RetryImportDrawer.js b/src/components/port/RetryImportDrawer.js new file mode 100644 index 00000000..9c45ee66 --- /dev/null +++ b/src/components/port/RetryImportDrawer.js @@ -0,0 +1,117 @@ +import withRetryImportFormState from 'metronome-wallet-ui-logic/src/hocs/withRetryImportFormState' +import PropTypes from 'prop-types' +import styled from 'styled-components' +import React from 'react' + +import { + ConfirmationWizard, + DisplayValue, + GasEditor, + Drawer, + Btn, + Sp +} from '../common' + +const ConfirmationContainer = styled.div` + font-size: 1.3rem; + font-weight: 600; + letter-spacing: 0.5px; + line-height: 1.5; + + & > span, + & > div { + color: ${p => p.theme.colors.primary}; + } +` + +const BtnContainer = styled.div` + background-image: linear-gradient(to bottom, #272727, #323232); + padding: 3.2rem 2.4rem; +` + +class RetryImportDrawer extends React.Component { + static propTypes = { + gasEstimateError: PropTypes.bool, + onRequestClose: PropTypes.func.isRequired, + onInputChange: PropTypes.func.isRequired, + useCustomGas: PropTypes.bool.isRequired, + importData: PropTypes.shape({ + destinationChain: PropTypes.string.isRequired, + originChain: PropTypes.string.isRequired, + value: PropTypes.string.isRequired + }), + resetForm: PropTypes.func.isRequired, + onSubmit: PropTypes.func.isRequired, + validate: PropTypes.func.isRequired, + gasPrice: PropTypes.string, + gasLimit: PropTypes.string, + errors: PropTypes.object.isRequired, + isOpen: PropTypes.bool.isRequired + } + + componentDidUpdate(prevProps) { + if (this.props.isOpen && prevProps.isOpen !== this.props.isOpen) { + this.props.resetForm() + } + } + + renderConfirmation = () => ( + + + You will import{' '} + {' '} + from the {this.props.importData.originChain} blockchain to + the {this.props.importData.destinationChain} blockchain. + + + ) + + renderForm = goToReview => ( +
+ +
+          {JSON.stringify(this.props.importData, null, 2)}
+        
+ + + + +
+ + + + Retry Import + + +
+ ) + + render() { + return ( + + + + ) + } +} + +export default withRetryImportFormState(RetryImportDrawer) From ef763cc811ca7cfbd325572a2ecf17abbf1832e5 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Mon, 18 Feb 2019 12:31:28 -0300 Subject: [PATCH 22/47] Add button in receipt to display raw meta (only in dev) --- public/main/preload.js | 3 +++ src/components/common/receipt/Receipt.js | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/public/main/preload.js b/public/main/preload.js index 77818338..8c7dcde6 100644 --- a/public/main/preload.js +++ b/public/main/preload.js @@ -1,6 +1,7 @@ 'use strict' const { ipcRenderer, clipboard, shell, remote } = require('electron') +const isDev = require('electron-is-dev') // @see http://electronjs.org/docs/tutorial/security#2-disable-nodejs-integration-for-remote-content @@ -16,6 +17,8 @@ window.openLink = function (url) { return shell.openExternal(url) } +window.isDev = isDev + window.ipcRenderer = { removeListener (eventName, listener) { return ipcRenderer.removeListener(eventName, listener) diff --git a/src/components/common/receipt/Receipt.js b/src/components/common/receipt/Receipt.js index 4bb78c01..d74fbdab 100644 --- a/src/components/common/receipt/Receipt.js +++ b/src/components/common/receipt/Receipt.js @@ -4,10 +4,10 @@ import TimeAgo from 'metronome-wallet-ui-logic/src/components/TimeAgo' import styled from 'styled-components' import React from 'react' +import { BaseBtn, Btn } from '../Btn' import DisplayValue from '../DisplayValue' import AmountRow from './AmountRow' import TypeRow from './TypeRow' -import { Btn } from '../Btn' const Container = styled.div` background-color: ${p => p.theme.colors.medium}; @@ -70,6 +70,17 @@ const ExplorerBtn = styled(Btn)` border-radius: 0; ` +const InspectBtn = styled(BaseBtn)` + letter-spacing: 1.4px; + color: ${p => p.theme.colors.weak}; + width: 100%; + font-size: 1.1rem; + line-height: 2; + padding: 0 1rem; + margin: -1rem 0 1rem; + text-transform: uppercase; +` + export default class Receipt extends React.Component { static propTypes = { onExplorerLinkClick: PropTypes.func.isRequired, @@ -210,6 +221,12 @@ export default class Receipt extends React.Component { {tx.blockNumber} )} + {tx.meta && window.isDev && ( + // eslint-disable-next-line no-alert + alert(JSON.stringify(tx.meta, null, 2))}> + Inspect raw metadata + + )} VIEW IN EXPLORER From 818e55db3d8362ee37eb80a0b70016640ce51911 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Mon, 18 Feb 2019 15:19:01 -0300 Subject: [PATCH 23/47] Remove attestations from transactions list --- src/components/common/receipt/Receipt.js | 19 ++++++++----------- .../dashboard/tx-list/row/Amount.js | 9 +++++++++ .../tx-list/row/AttestationDetails.js | 17 +++++++++++++++++ .../dashboard/tx-list/row/Details.js | 4 ++++ 4 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 src/components/dashboard/tx-list/row/AttestationDetails.js diff --git a/src/components/common/receipt/Receipt.js b/src/components/common/receipt/Receipt.js index d74fbdab..aed27159 100644 --- a/src/components/common/receipt/Receipt.js +++ b/src/components/common/receipt/Receipt.js @@ -102,12 +102,12 @@ export default class Receipt extends React.Component { return ( - {tx.txType !== 'unknown' && ( + {tx.txType !== 'unknown' && tx.txType !== 'attestation' && ( )} @@ -193,15 +193,12 @@ export default class Receipt extends React.Component { {this.props.confirmations} - {(tx.txType === 'import-requested' || - tx.txType === 'imported' || - tx.txType === 'exported') && - tx.portBurnHash && ( - - - {tx.portBurnHash} - - )} + {tx.portBurnHash && ( + + + {tx.portBurnHash} + + )} {tx.gasUsed && ( diff --git a/src/components/dashboard/tx-list/row/Amount.js b/src/components/dashboard/tx-list/row/Amount.js index 520e5bc7..6c9e2d9f 100644 --- a/src/components/dashboard/tx-list/row/Amount.js +++ b/src/components/dashboard/tx-list/row/Amount.js @@ -35,12 +35,14 @@ const Container = styled.div` export default class Amount extends React.Component { static propTypes = { + isAttestationValid: PropTypes.bool, isProcessing: PropTypes.bool, isPending: PropTypes.bool, isFailed: PropTypes.bool.isRequired, symbol: PropTypes.string, txType: PropTypes.oneOf([ 'import-requested', + 'attestation', 'converted', 'imported', 'exported', @@ -52,6 +54,7 @@ export default class Amount extends React.Component { value: PropTypes.string.isRequired } + // eslint-disable-next-line complexity render() { return ( ) : this.props.txType === 'converted' ? ( + ) : this.props.txType === 'attestation' && + this.props.isAttestationValid ? ( +
Attestation Valid
+ ) : this.props.txType === 'attestation' && + !this.props.isAttestationValid ? ( +
Attestation Invalid
) : this.props.txType === 'unknown' || this.props.isProcessing ? (
New transaction
) : ( diff --git a/src/components/dashboard/tx-list/row/AttestationDetails.js b/src/components/dashboard/tx-list/row/AttestationDetails.js new file mode 100644 index 00000000..e5d6b1f9 --- /dev/null +++ b/src/components/dashboard/tx-list/row/AttestationDetails.js @@ -0,0 +1,17 @@ +import PropTypes from 'prop-types' +import React from 'react' + +export default class AttestationDetails extends React.Component { + static propTypes = { + isAttestationValid: PropTypes.bool + } + + render() { + return ( +
+ A validator {this.props.isAttestationValid ? 'attested' : 'refuted'} an + import +
+ ) + } +} diff --git a/src/components/dashboard/tx-list/row/Details.js b/src/components/dashboard/tx-list/row/Details.js index 31c31abb..a795b416 100644 --- a/src/components/dashboard/tx-list/row/Details.js +++ b/src/components/dashboard/tx-list/row/Details.js @@ -3,6 +3,7 @@ import styled from 'styled-components' import React from 'react' import ImportRequestedDetails from './ImportRequestedDetails' +import AttestationDetails from './AttestationDetails' import ConvertedDetails from './ConvertedDetails' import ImportedDetails from './ImportedDetails' import ExportedDetails from './ExportedDetails' @@ -36,6 +37,7 @@ export default class Details extends React.Component { isFailed: PropTypes.bool.isRequired, txType: PropTypes.oneOf([ 'import-requested', + 'attestation', 'converted', 'received', 'imported', @@ -65,6 +67,8 @@ export default class Details extends React.Component { ) : this.props.txType === 'exported' ? ( + ) : this.props.txType === 'attestation' ? ( + ) : (
Waiting for metadata
)} From cb6216c1afd22fcee9a565a776fad6c97722469c Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Mon, 18 Feb 2019 15:59:42 -0300 Subject: [PATCH 24/47] Fix retry import checksum address issue --- src/components/port/Port.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/port/Port.js b/src/components/port/Port.js index 27d3ca18..af499663 100644 --- a/src/components/port/Port.js +++ b/src/components/port/Port.js @@ -1,3 +1,4 @@ +import { toChecksumAddress } from 'web3-utils' import withPortState from 'metronome-wallet-ui-logic/src/hocs/withPortState' import PropTypes from 'prop-types' import styled from 'styled-components' @@ -147,7 +148,13 @@ class Port extends React.Component { const retryCandidate = this.props.failedImports.find( ({ currentBurnHash }) => currentBurnHash === hash ) - this.setState({ activeModal: 'retry-import', retryCandidate }) + this.setState({ + activeModal: 'retry-import', + retryCandidate: { + ...retryCandidate, + from: toChecksumAddress(retryCandidate.from) + } + }) } render() { From f3f1f4155087b5fda1dd2cb238940495313276c3 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Mon, 18 Feb 2019 16:32:35 -0300 Subject: [PATCH 25/47] Implement estimateGasLimit before import in portMetronome and expose estimateGasLimit methods for export and import --- public/main/client/handlers/multi-core.js | 29 +++++++++++++------ public/main/client/handlers/single-core.js | 8 ++--- .../main/client/subscriptions/single-core.js | 2 ++ src/client/index.js | 1 + 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/public/main/client/handlers/multi-core.js b/public/main/client/handlers/multi-core.js index 6151b28d..7b0a3b3d 100644 --- a/public/main/client/handlers/multi-core.js +++ b/public/main/client/handlers/multi-core.js @@ -60,7 +60,7 @@ function getPortFees (data, cores) { .getExportMetFee(data, exportCore) .then(fee => singleCore - .estimateExportMetGas(Object.assign({}, data, { fee }), exportCore) + .getExportGasLimit(Object.assign({}, data, { fee }), exportCore) .then(({ gasLimit }) => ({ exportGasLimit: gasLimit, fee })) ) } @@ -75,10 +75,12 @@ function portMetronome (data, cores) { return singleCore .exportMetronome(exportData, exportCore) .then(function ({ receipt }) { - const parsedExportReceipt = flatten(Object.keys(receipt.events) - .filter(e => !receipt.events[e].event) // Filter already parsed event keys - .map(e => receipt.events[e]) // Get not parsed events - .map(e => exportCore.coreApi.explorer.tryParseEventLog(e))) // Try to parse each event + const parsedExportReceipt = flatten( + Object.keys(receipt.events) + .filter(e => !receipt.events[e].event) // Filter already parsed event keys + .map(e => receipt.events[e]) // Get not parsed events + .map(e => exportCore.coreApi.explorer.tryParseEventLog(e)) + ) // Try to parse each event .find(e => e.parsed.event === 'LogExportReceipt') // Get LogExportReceipt event if (!parsedExportReceipt || !parsedExportReceipt.parsed) { return Promise.reject( @@ -87,7 +89,7 @@ function portMetronome (data, cores) { } const { returnValues } = parsedExportReceipt.parsed const importCore = findCore(cores, data.destinationChain) - const importData = Object.assign({}, data, { + const importData = { blockTimestamp: returnValues.blockTimestamp, burnSequence: returnValues.burnSequence, currentBurnHash: returnValues.currentBurnHash, @@ -101,9 +103,18 @@ function portMetronome (data, cores) { originChain: config.chains[data.chain].symbol, previousBurnHash: returnValues.prevBurnHash, supply: returnValues.supplyOnAllChains, - value: returnValues.amountToBurn - }) - return singleCore.importMetronome(importData, importCore) + value: returnValues.amountToBurn, + password: data.password, + walletId: data.walletId + } + return singleCore + .getImportGasLimit(importData, importCore) + .then(function ({ gasLimit }) { + return singleCore.importMetronome( + Object.assign({}, importData, { gas: gasLimit }), + importCore + ) + }) }) } diff --git a/public/main/client/handlers/single-core.js b/public/main/client/handlers/single-core.js index 27289dcc..1f8f088f 100644 --- a/public/main/client/handlers/single-core.js +++ b/public/main/client/handlers/single-core.js @@ -114,7 +114,7 @@ const sendMet = (data, { coreApi }) => const getExportMetFee = (data, { coreApi }) => coreApi.metronome.getExportMetFee(data) -const estimateExportMetGas = (data, { coreApi }) => +const getExportGasLimit = (data, { coreApi }) => coreApi.metronome.estimateExportMetGas( Object.assign({}, data, { destinationChain: config.chains[data.destinationChain].symbol, @@ -124,7 +124,7 @@ const estimateExportMetGas = (data, { coreApi }) => }) ) -const estimateImportMetGas = (data, { coreApi }) => +const getImportGasLimit = (data, { coreApi }) => coreApi.metronome.estimateImportMetGas(data) const exportMetronome = (data, core) => @@ -139,10 +139,10 @@ module.exports = { getConvertCoinGasLimit, getConvertMetEstimate, getConvertMetGasLimit, - estimateExportMetGas, - estimateImportMetGas, refreshTransaction, getAuctionGasLimit, + getExportGasLimit, + getImportGasLimit, getTokensGasLimit, getExportMetFee, exportMetronome, diff --git a/public/main/client/subscriptions/single-core.js b/public/main/client/subscriptions/single-core.js index b86c026d..80856871 100644 --- a/public/main/client/subscriptions/single-core.js +++ b/public/main/client/subscriptions/single-core.js @@ -8,6 +8,8 @@ const withCore = core => fn => data => fn(data, core) const listeners = { 'get-convert-coin-gas-limit': handlers.getConvertCoinGasLimit, 'get-convert-coin-estimate': handlers.getConvertCoinEstimate, + 'get-export-gas-limit': handlers.getExportMetGas, + 'get-import-gas-limit': handlers.getImportMetGas, 'get-convert-met-gas-limit': handlers.getConvertMetGasLimit, 'refresh-all-transactions': handlers.refreshAllTransactions, 'get-convert-met-estimate': handlers.getConvertMetEstimate, diff --git a/src/client/index.js b/src/client/index.js index 727e5372..ad32b778 100644 --- a/src/client/index.js +++ b/src/client/index.js @@ -93,6 +93,7 @@ function createClient(createStore) { recoverFromMnemonic: utils.forwardToMainProcess('recover-from-mnemonic'), getAuctionGasLimit: utils.forwardToMainProcess('get-auction-gas-limit'), getImportGasLimit: utils.forwardToMainProcess('get-import-gas-limit'), + getExportGasLimit: utils.forwardToMainProcess('get-export-gas-limit'), getTokensGasLimit: utils.forwardToMainProcess('get-tokens-gas-limit'), portMetronome: utils.forwardToMainProcess('port-metronome', 750000), validatePassword: utils.forwardToMainProcess('validate-password'), From 451872de1cedd32e16f8a85b926dc7aebd6b940e Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Mon, 18 Feb 2019 21:09:49 -0300 Subject: [PATCH 26/47] Add hidden handler to allow Show/Hide attestations in transactions list (only in dev mode) --- src/components/dashboard/tx-list/Header.js | 3 ++- src/components/dashboard/tx-list/TxList.js | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/tx-list/Header.js b/src/components/dashboard/tx-list/Header.js index a2c3a46b..e2544684 100644 --- a/src/components/dashboard/tx-list/Header.js +++ b/src/components/dashboard/tx-list/Header.js @@ -46,6 +46,7 @@ export default class Header extends React.Component { onWalletRefresh: PropTypes.func.isRequired, onFilterChange: PropTypes.func.isRequired, activeFilter: PropTypes.string.isRequired, + onTitleClick: PropTypes.func.isRequired, syncStatus: PropTypes.oneOf(['up-to-date', 'syncing', 'failed']).isRequired } @@ -53,7 +54,7 @@ export default class Header extends React.Component { return ( - Transactions + Transactions {(this.props.hasTransactions || this.props.syncStatus !== 'syncing') && ( { + if (!window.isDev || !e.shiftKey || !e.altKey) return + this.setState(state => ({ + ...state, + displayAttestations: !state.displayAttestations + })) + } + render() { if (!this.state.isReady) return null return ( + this.state.displayAttestations ? true : txType !== 'attestation' + )} > {({ filteredItems, onFilterChange, activeFilter }) => ( @@ -109,6 +120,7 @@ class TxList extends React.Component { onWalletRefresh={this.props.onWalletRefresh} hasTransactions={this.props.hasTransactions} onFilterChange={onFilterChange} + onTitleClick={this.handleClick} activeFilter={activeFilter} syncStatus={this.props.syncStatus} /> From 385d91c0e2e8fa1662e8994703b5f3de24f2ef7d Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Mon, 18 Feb 2019 21:10:33 -0300 Subject: [PATCH 27/47] Implement displaying ongoing ports --- src/components/port/OngoingImports.js | 121 ++++++++++++++++++++++++ src/components/port/Port.js | 130 +++++++------------------- src/subscriptions.js | 1 + 3 files changed, 156 insertions(+), 96 deletions(-) create mode 100644 src/components/port/OngoingImports.js diff --git a/src/components/port/OngoingImports.js b/src/components/port/OngoingImports.js new file mode 100644 index 00000000..416cc269 --- /dev/null +++ b/src/components/port/OngoingImports.js @@ -0,0 +1,121 @@ +import PropTypes from 'prop-types' +import styled from 'styled-components' +import React from 'react' + +import { DisplayValue, Flex } from '../common' + +const List = styled.ul` + list-style-type: none; + padding: 0; + margin-left: 0; + margin-right: 0; + margin-top: 2.4rem; + margin-bottom: 4.8rem; +` + +const Item = styled.li` + background-color: ${({ theme }) => theme.colors.lightShade}; + border-radius: 2px; + padding: 1.2rem 2.4rem 1.2rem 1.6rem; + + & + & { + margin-top: 1.6rem; + } +` + +const LeftLabel = styled.div` + font-size: 1.1rem; + letter-spacing: 0.4px; + color: #c2c4c6; +` + +const Hiddable = styled.span` + display: none; + + @media (min-width: 1000px) { + display: inline; + } +` + +const Validations = styled.span` + background-color: ${({ theme }) => theme.colors.darkShade}; + color: ${({ theme }) => theme.colors.light}; + padding: 0.5rem 1.2rem; + border-radius: 1.2rem; + margin-right: 1.6rem; +` + +const Refutations = styled.span` + color: ${({ theme }) => theme.colors.warning}; + padding: 0.5rem 1.2rem; + margin-right: 1.6rem; +` + +const Amount = styled.div` + color: ${({ theme }) => theme.colors.primary}; + font-size: 2rem; + font-weight: 600; +` + +const Details = styled.div` + font-size: 1.1rem; + letter-spacing: 0.4px; + color: #c2c4c6; + + & > span { + color: ${({ theme }) => theme.colors.light}; + font-size: 1.3rem; + font-weight: 600; + text-transform: uppercase; + } +` + +export default class OngoingImports extends React.Component { + static propTypes = { + attestationThreshold: PropTypes.number.isRequired, + items: PropTypes.arrayOf( + PropTypes.shape({ + attestedCount: PropTypes.number.isRequired, + refutedCount: PropTypes.number.isRequired, + importedFrom: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + hash: PropTypes.string.isRequired + }) + ).isRequired + } + + render() { + return ( + + {this.props.items.map(item => ( + + + + + {item.attestedCount} / {this.props.attestationThreshold} + {' '} + VALIDATIONS{' '} + {item.refutedCount > 0 && ( + + {item.refutedCount}{' '} + + {item.refutedCount > 1 ? 'REFUTATIONS' : 'REFUTATION'} + + + )} + + + + + +
+ IMPORTING FROM {item.importedFrom} BLOCKCHAIN +
+
+
+
+ ))} +
+ ) + } +} diff --git a/src/components/port/Port.js b/src/components/port/Port.js index af499663..740108dc 100644 --- a/src/components/port/Port.js +++ b/src/components/port/Port.js @@ -4,8 +4,9 @@ import PropTypes from 'prop-types' import styled from 'styled-components' import React from 'react' -import { DarkLayout, DisplayValue, Flex, Btn } from '../common' +import { DarkLayout, Flex, Btn } from '../common' import RetryImportDrawer from './RetryImportDrawer' +import OngoingImports from './OngoingImports' import FailedImports from './FailedImports' import PortDrawer from './PortDrawer' @@ -33,66 +34,11 @@ const Description = styled.p` color: #c2c4c6; margin-top: 0.8rem; margin-bottom: 0; -` - -const List = styled.ul` - list-style-type: none; - padding: 0; - margin-left: 0; - margin-right: 0; - margin-top: 2.4rem; - margin-bottom: 4.8rem; -` - -const Item = styled.li` - background-color: ${({ theme }) => theme.colors.lightShade}; - border-radius: 2px; - padding: 1.2rem 2.4rem 1.2rem 1.6rem; - - & + & { - margin-top: 1.6rem; - } -` - -const LeftLabel = styled.div` - font-size: 1.4rem; - letter-spacing: 0.4px; - color: #c2c4c6; -` - -const Hiddable = styled.span` - display: none; - - @media (min-width: 1000px) { - display: inline; - } -` - -const Validations = styled.span` - background-color: ${({ theme }) => theme.colors.darkShade}; - color: ${({ theme }) => theme.colors.light}; - padding: 0.5rem 1.2rem; - border-radius: 1.2rem; - margin-right: 2.4rem; - font-size: 1.1rem; -` - -const Amount = styled.div` - color: ${({ theme }) => theme.colors.primary}; - font-size: 2rem; - font-weight: 600; -` - -const Details = styled.div` - font-size: 1.1rem; - letter-spacing: 0.4px; - color: #c2c4c6; & > span { color: ${({ theme }) => theme.colors.light}; font-size: 1.3rem; font-weight: 600; - text-transform: uppercase; } ` @@ -102,7 +48,7 @@ const BtnContainer = styled.div` align-self: center; @media (min-width: 1000px) { - margin-top: 5rem; + margin-top: 7.2rem; margin-left: 2.4rem; margin-bottom: 0; order: 0; @@ -116,16 +62,16 @@ const PortBtn = styled(Btn)` class Port extends React.Component { static propTypes = { + attestationThreshold: PropTypes.number.isRequired, retryDisabledReason: PropTypes.string, portDisabledReason: PropTypes.string, shouldRenderForm: PropTypes.bool.isRequired, - pendingImports: PropTypes.arrayOf( + ongoingImports: PropTypes.arrayOf( PropTypes.shape({ - destinationChain: PropTypes.string.isRequired, - totalValidators: PropTypes.number.isRequired, - validations: PropTypes.number.isRequired, - originChain: PropTypes.string.isRequired, - amount: PropTypes.string.isRequired, + attestedCount: PropTypes.number.isRequired, + refutedCount: PropTypes.number.isRequired, + importedFrom: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, hash: PropTypes.string.isRequired }) ).isRequired, @@ -162,40 +108,12 @@ class Port extends React.Component { - {this.props.pendingImports.length > 0 && ( - - Pending Imports - - {this.props.pendingImports.map(item => ( - - - - - {item.validations}/{item.totalValidators} - {' '} - VALIDATIONS - - - - - -
- IMPORTING FROM {item.originChain} to{' '} - {item.destinationChain} -
-
-
-
- ))} -
-
- )} {this.props.failedImports.length > 0 && ( -
- Failed Imports + + Failed Ports - Resubmit incomplete imports that failed to excecute by - clicking Retry. + Resubmit incomplete ports that failed to excecute by clicking + Retry. -
+
+ )} + + {this.props.ongoingImports.length > 0 && ( + + Ongoing Ports + + An Import Request requires at least{' '} + + {this.props.attestationThreshold}{' '} + {this.props.attestationThreshold > 1 + ? 'validations' + : 'validation'} + {' '} + for the MET to be imported on this chain. + + + )} diff --git a/src/subscriptions.js b/src/subscriptions.js index e77ea856..28ec8956 100644 --- a/src/subscriptions.js +++ b/src/subscriptions.js @@ -3,6 +3,7 @@ export function subscribeToMainProcessMessages(store) { 'indexer-connection-status-changed', 'metronome-token-status-updated', 'web3-connection-status-changed', + 'attestation-threshold-updated', 'connectivity-state-changed', 'transactions-scan-finished', 'transactions-scan-started', From 96330f5f0d043dbb51c006af933f5fec5b422001 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Tue, 19 Feb 2019 15:25:10 -0300 Subject: [PATCH 28/47] Add styles for Retry Import form --- src/components/port/Port.js | 3 +- src/components/port/PortDrawer.js | 38 +++---------- src/components/port/ReadOnlyField.js | 47 ++++++++++++++++ src/components/port/RetryImportDrawer.js | 72 ++++++++++++++++++------ 4 files changed, 112 insertions(+), 48 deletions(-) create mode 100644 src/components/port/ReadOnlyField.js diff --git a/src/components/port/Port.js b/src/components/port/Port.js index 740108dc..4c202047 100644 --- a/src/components/port/Port.js +++ b/src/components/port/Port.js @@ -87,8 +87,7 @@ class Port extends React.Component { onOpenModal = e => this.setState({ activeModal: e.target.dataset.modal }) - onCloseModal = () => - this.setState({ activeModal: null, retryCandidate: null }) + onCloseModal = () => this.setState({ activeModal: null }) onRetryClick = hash => { const retryCandidate = this.props.failedImports.find( diff --git a/src/components/port/PortDrawer.js b/src/components/port/PortDrawer.js index 6f0fd503..6471efc1 100644 --- a/src/components/port/PortDrawer.js +++ b/src/components/port/PortDrawer.js @@ -3,6 +3,8 @@ import PropTypes from 'prop-types' import styled from 'styled-components' import React from 'react' +import ReadOnlyField from './ReadOnlyField' +import FeeEstimates from './FeeEstimates' import { ConfirmationWizard, DisplayValue, @@ -11,32 +13,9 @@ import { FieldBtn, Selector, Drawer, - Label, - Flex, Btn, Sp } from '../common' -import FeeEstimates from './FeeEstimates' - -const SourceField = styled(Flex.Row)` - background-color: ${({ theme }) => theme.colors.lightShade}; - padding: 2rem 1.6rem; - margin-top: 0.8rem; -` - -const ChainName = styled.div` - color: ${({ theme }) => theme.colors.light}; - font-size: 1.3rem; - letter-spacing: 0.5px; - font-weight: 600; -` - -const Balance = styled.div` - color: ${({ theme }) => theme.colors.primary}; - font-size: 1.3rem; - letter-spacing: 0.5px; - font-weight: 600; -` const ConfirmationContainer = styled.div` font-size: 1.3rem; @@ -110,13 +89,12 @@ class PortDrawer extends React.Component { renderForm = goToReview => (
- - - {this.props.sourceDisplayName} - - - - + } + value={this.props.sourceDisplayName} + label="Source" + id="source-field" + /> theme.colors.lightShade}; + padding: 2rem 1.6rem; + margin-top: 0.8rem; + min-height: 5.6rem; +` + +const Value = styled.div` + color: ${({ theme }) => theme.colors.light}; + font-size: 1.3rem; + letter-spacing: 0.5px; + font-weight: 600; +` + +const Suffix = styled.div` + color: ${({ theme }) => theme.colors.primary}; + font-size: 1.3rem; + letter-spacing: 0.5px; + font-weight: 600; +` + +export default class ReadOnlyField extends React.Component { + static propTypes = { + suffix: PropTypes.node, + label: PropTypes.string.isRequired, + value: PropTypes.node.isRequired, + id: PropTypes.string.isRequired + } + + render() { + return ( +
+ + + {this.props.value} + {this.props.suffix && {this.props.suffix}} + +
+ ) + } +} diff --git a/src/components/port/RetryImportDrawer.js b/src/components/port/RetryImportDrawer.js index 9c45ee66..3b5fdaa0 100644 --- a/src/components/port/RetryImportDrawer.js +++ b/src/components/port/RetryImportDrawer.js @@ -1,17 +1,30 @@ import withRetryImportFormState from 'metronome-wallet-ui-logic/src/hocs/withRetryImportFormState' import PropTypes from 'prop-types' +import TimeAgo from 'metronome-wallet-ui-logic/src/components/TimeAgo' import styled from 'styled-components' import React from 'react' +import ReadOnlyField from './ReadOnlyField' import { ConfirmationWizard, DisplayValue, GasEditor, Drawer, + Flex, Btn, Sp } from '../common' +const Message = styled.div` + font-size: 1.3rem; + color: rgba(255, 255, 255, 0.5); + padding-bottom: 2.4rem; + + & span { + color: ${p => p.theme.colors.light}; + } +` + const ConfirmationContainer = styled.div` font-size: 1.3rem; font-weight: 600; @@ -31,22 +44,23 @@ const BtnContainer = styled.div` class RetryImportDrawer extends React.Component { static propTypes = { + destinationDisplayName: PropTypes.string.isRequired, + originDisplayName: PropTypes.string.isRequired, gasEstimateError: PropTypes.bool, onRequestClose: PropTypes.func.isRequired, + formattedTime: PropTypes.string.isRequired, onInputChange: PropTypes.func.isRequired, useCustomGas: PropTypes.bool.isRequired, - importData: PropTypes.shape({ - destinationChain: PropTypes.string.isRequired, - originChain: PropTypes.string.isRequired, - value: PropTypes.string.isRequired - }), + timestamp: PropTypes.number.isRequired, resetForm: PropTypes.func.isRequired, onSubmit: PropTypes.func.isRequired, validate: PropTypes.func.isRequired, gasPrice: PropTypes.string, gasLimit: PropTypes.string, errors: PropTypes.object.isRequired, - isOpen: PropTypes.bool.isRequired + isOpen: PropTypes.bool.isRequired, + value: PropTypes.string.isRequired, + fee: PropTypes.string.isRequired } componentDidUpdate(prevProps) { @@ -58,10 +72,10 @@ class RetryImportDrawer extends React.Component { renderConfirmation = () => ( - You will import{' '} - {' '} - from the {this.props.importData.originChain} blockchain to - the {this.props.importData.destinationChain} blockchain. + You will request an import of{' '} + from the{' '} + {this.props.originDisplayName} blockchain to the{' '} + {this.props.destinationDisplayName} blockchain. ) @@ -69,11 +83,38 @@ class RetryImportDrawer extends React.Component { renderForm = goToReview => ( -
-          {JSON.stringify(this.props.importData, null, 2)}
-        
- - + + This Port operation was initiated{' '} + + + + . + + + + + + } + label="Amount (MET)" + id="value" + /> + + + + } + label="Fee (MET)" + id="fee" + /> + + + + - Retry Import From 2fb71037cd6ffc08826a6856d6a4f8c4187542c9 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Tue, 19 Feb 2019 11:01:43 -0300 Subject: [PATCH 29/47] Call getMerkleRoot before import --- public/main/client/handlers/multi-core.js | 17 +++++++++++------ public/main/client/handlers/single-core.js | 4 ++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/public/main/client/handlers/multi-core.js b/public/main/client/handlers/multi-core.js index 7b0a3b3d..8da2e3a3 100644 --- a/public/main/client/handlers/multi-core.js +++ b/public/main/client/handlers/multi-core.js @@ -108,12 +108,17 @@ function portMetronome (data, cores) { walletId: data.walletId } return singleCore - .getImportGasLimit(importData, importCore) - .then(function ({ gasLimit }) { - return singleCore.importMetronome( - Object.assign({}, importData, { gas: gasLimit }), - importCore - ) + .getMerkleRoot({ burnSequence: returnValues.burnSequence }, exportCore) + .then(function (root) { + Object.assign(importData, { root }) + return singleCore + .getImportGasLimit(importData, importCore) + .then(({ gasLimit }) => + singleCore.importMetronome( + Object.assign({}, importData, { gas: gasLimit }), + importCore + ) + ) }) }) } diff --git a/public/main/client/handlers/single-core.js b/public/main/client/handlers/single-core.js index 1f8f088f..0246eba9 100644 --- a/public/main/client/handlers/single-core.js +++ b/public/main/client/handlers/single-core.js @@ -133,6 +133,9 @@ const exportMetronome = (data, core) => const importMetronome = (data, core) => withAuth(core.coreApi.metronome.importMet)(data, core) +const getMerkleRoot = (data, { coreApi }) => + coreApi.metronome.getMerkleRoot(data) + module.exports = { refreshAllTransactions, getConvertCoinEstimate, @@ -147,6 +150,7 @@ module.exports = { getExportMetFee, exportMetronome, importMetronome, + getMerkleRoot, buyMetronome, createWallet, getGasLimit, From fe655081cac9694f448d03394ef61434330624f0 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Tue, 19 Feb 2019 11:51:56 -0300 Subject: [PATCH 30/47] Fix call parameter --- public/main/client/handlers/multi-core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/main/client/handlers/multi-core.js b/public/main/client/handlers/multi-core.js index 8da2e3a3..a7a8b0e4 100644 --- a/public/main/client/handlers/multi-core.js +++ b/public/main/client/handlers/multi-core.js @@ -108,7 +108,7 @@ function portMetronome (data, cores) { walletId: data.walletId } return singleCore - .getMerkleRoot({ burnSequence: returnValues.burnSequence }, exportCore) + .getMerkleRoot(returnValues.burnSequence, exportCore) .then(function (root) { Object.assign(importData, { root }) return singleCore From 7899ecef4c25132ca323f49e30a71afe6a5d8880 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Tue, 19 Feb 2019 17:00:09 -0300 Subject: [PATCH 31/47] Refactor import methods to get merkleRoot before estimate gas and request a new import. --- public/main/client/handlers/multi-core.js | 28 ++++++++++++++++--- .../main/client/subscriptions/multi-core.js | 2 ++ .../main/client/subscriptions/single-core.js | 4 +-- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/public/main/client/handlers/multi-core.js b/public/main/client/handlers/multi-core.js index a7a8b0e4..31481a61 100644 --- a/public/main/client/handlers/multi-core.js +++ b/public/main/client/handlers/multi-core.js @@ -52,10 +52,12 @@ function onLoginSubmit (data, cores) { }) } -const findCore = (cores, chain) => cores.find(e => e.chain === chain) +const findCoreByChainName = (cores, chain) => cores.find(e => e.chain === chain) + +const findCoreBySymbol = (cores, ticker) => cores.find(e => e.config.symbol === ticker) function getPortFees (data, cores) { - const exportCore = findCore(cores, data.chain) + const exportCore = findCoreByChainName(cores, data.chain) return singleCore .getExportMetFee(data, exportCore) .then(fee => @@ -65,8 +67,24 @@ function getPortFees (data, cores) { ) } +const withMerkleRoot = fn => function (data, cores) { + const exportCore = findCoreBySymbol(cores, data.originChain) + const importCore = findCoreByChainName(cores, data.chain) + return singleCore.getMerkleRoot(data.burnSequence, exportCore) + .then(function (root) { + const importData = Object.assign({}, data, { root }) + return fn(importData, importCore) + }) +} + +const importMetronome = (data, cores) => + withMerkleRoot(singleCore.importMetronome)(data, cores) + +const getImportMetGas = (data, cores) => + withMerkleRoot(singleCore.getImportGasLimit)(data, cores) + function portMetronome (data, cores) { - const exportCore = findCore(cores, data.chain) + const exportCore = findCoreByChainName(cores, data.chain) const exportData = Object.assign({}, data, { destinationChain: config.chains[data.destinationChain].symbol, destinationMetAddress: config.chains[data.destinationChain].metTokenAddress, @@ -88,7 +106,7 @@ function portMetronome (data, cores) { ) } const { returnValues } = parsedExportReceipt.parsed - const importCore = findCore(cores, data.destinationChain) + const importCore = findCoreByChainName(cores, data.destinationChain) const importData = { blockTimestamp: returnValues.blockTimestamp, burnSequence: returnValues.burnSequence, @@ -126,6 +144,8 @@ function portMetronome (data, cores) { module.exports = { onboardingCompleted, recoverFromMnemonic, + importMetronome, + getImportMetGas, portMetronome, onLoginSubmit, getPortFees diff --git a/public/main/client/subscriptions/multi-core.js b/public/main/client/subscriptions/multi-core.js index f0371f22..3c5e8503 100644 --- a/public/main/client/subscriptions/multi-core.js +++ b/public/main/client/subscriptions/multi-core.js @@ -8,7 +8,9 @@ const withCores = cores => fn => data => fn(data, cores) const listeners = { 'recover-from-mnemonic': handlers.recoverFromMnemonic, 'onboarding-completed': handlers.onboardingCompleted, + 'get-import-gas-limit': handlers.getImportMetGas, 'port-metronome': handlers.portMetronome, + 'retry-import': handlers.importMetronome, 'login-submit': handlers.onLoginSubmit, 'get-port-fees': handlers.getPortFees } diff --git a/public/main/client/subscriptions/single-core.js b/public/main/client/subscriptions/single-core.js index 80856871..93e6df0e 100644 --- a/public/main/client/subscriptions/single-core.js +++ b/public/main/client/subscriptions/single-core.js @@ -8,15 +8,13 @@ const withCore = core => fn => data => fn(data, core) const listeners = { 'get-convert-coin-gas-limit': handlers.getConvertCoinGasLimit, 'get-convert-coin-estimate': handlers.getConvertCoinEstimate, - 'get-export-gas-limit': handlers.getExportMetGas, - 'get-import-gas-limit': handlers.getImportMetGas, 'get-convert-met-gas-limit': handlers.getConvertMetGasLimit, 'refresh-all-transactions': handlers.refreshAllTransactions, 'get-convert-met-estimate': handlers.getConvertMetEstimate, 'get-auction-gas-limit': handlers.getAuctionGasLimit, 'get-tokens-gas-limit': handlers.getTokensGasLimit, 'refresh-transaction': handlers.refreshTransaction, - 'retry-import': handlers.importMetronome, + 'get-export-gas-limit': handlers.getExportMetGas, 'buy-metronome': handlers.buyMetronome, 'get-gas-limit': handlers.getGasLimit, 'get-gas-price': handlers.getGasPrice, From 0ed4d80aa1bf2b6938abd69512b9eec6d50bb3dd Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Tue, 19 Feb 2019 17:35:35 -0300 Subject: [PATCH 32/47] Fix propType warning --- src/components/dashboard/tx-list/row/Icon.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/dashboard/tx-list/row/Icon.js b/src/components/dashboard/tx-list/row/Icon.js index f0423215..30323225 100644 --- a/src/components/dashboard/tx-list/row/Icon.js +++ b/src/components/dashboard/tx-list/row/Icon.js @@ -27,6 +27,7 @@ export default class Icon extends React.Component { isFailed: PropTypes.bool.isRequired, txType: PropTypes.oneOf([ 'import-requested', + 'attestation', 'converted', 'received', 'imported', From aec8160930c164e8fce700cb74153c2db63fed68 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Wed, 20 Feb 2019 14:57:26 -0300 Subject: [PATCH 33/47] Add Retry button in ongoing ports list --- src/components/port/FailedImports.js | 21 ++------------------- src/components/port/OngoingImports.js | 18 ++++++++++++++++++ src/components/port/Port.js | 9 ++++++--- src/components/port/RetryBtn.js | 23 +++++++++++++++++++++++ 4 files changed, 49 insertions(+), 22 deletions(-) create mode 100644 src/components/port/RetryBtn.js diff --git a/src/components/port/FailedImports.js b/src/components/port/FailedImports.js index 6ed911cb..8f9afccb 100644 --- a/src/components/port/FailedImports.js +++ b/src/components/port/FailedImports.js @@ -2,7 +2,8 @@ import PropTypes from 'prop-types' import styled from 'styled-components' import React from 'react' -import { DisplayValue, Flex, Btn } from '../common' +import { DisplayValue, Flex } from '../common' +import RetryBtn from './RetryBtn' const List = styled.ul` list-style-type: none; @@ -48,24 +49,6 @@ const Details = styled.div` } ` -const RetryBtn = styled(Btn)` - margin-left: 2.4rem; - background-color: rgba(126, 97, 248, 0.4); - background-image: none; - color: ${({ theme }) => theme.colors.light}; - font-size: 1.3rem; - letter-spacing: 0.4px; - min-width: 108px; - padding-top: 0.7rem; - padding-bottom: 0.7rem; - box-shadow: none; - - &:hover, - &:focus { - opacity: 0.8; - } -` - export default class FailedImports extends React.Component { static propTypes = { retryDisabledReason: PropTypes.string, diff --git a/src/components/port/OngoingImports.js b/src/components/port/OngoingImports.js index 416cc269..a3761920 100644 --- a/src/components/port/OngoingImports.js +++ b/src/components/port/OngoingImports.js @@ -3,6 +3,7 @@ import styled from 'styled-components' import React from 'react' import { DisplayValue, Flex } from '../common' +import RetryBtn from './RetryBtn' const List = styled.ul` list-style-type: none; @@ -27,6 +28,7 @@ const LeftLabel = styled.div` font-size: 1.1rem; letter-spacing: 0.4px; color: #c2c4c6; + flex-grow: 1; ` const Hiddable = styled.span` @@ -73,6 +75,9 @@ const Details = styled.div` export default class OngoingImports extends React.Component { static propTypes = { attestationThreshold: PropTypes.number.isRequired, + retryDisabledReason: PropTypes.string, + retryDisabled: PropTypes.bool.isRequired, + onRetryClick: PropTypes.func.isRequired, items: PropTypes.arrayOf( PropTypes.shape({ attestedCount: PropTypes.number.isRequired, @@ -84,6 +89,8 @@ export default class OngoingImports extends React.Component { ).isRequired } + handleRetryClick = e => this.props.onRetryClick(e.target.dataset.hash) + render() { return ( @@ -112,6 +119,17 @@ export default class OngoingImports extends React.Component { IMPORTING FROM {item.importedFrom} BLOCKCHAIN + + Retry + ))} diff --git a/src/components/port/Port.js b/src/components/port/Port.js index 4c202047..bfd43cc8 100644 --- a/src/components/port/Port.js +++ b/src/components/port/Port.js @@ -90,9 +90,9 @@ class Port extends React.Component { onCloseModal = () => this.setState({ activeModal: null }) onRetryClick = hash => { - const retryCandidate = this.props.failedImports.find( - ({ currentBurnHash }) => currentBurnHash === hash - ) + const retryCandidate = this.props.failedImports + .concat(this.props.ongoingImports) + .find(({ currentBurnHash }) => currentBurnHash === hash) this.setState({ activeModal: 'retry-import', retryCandidate: { @@ -138,6 +138,9 @@ class Port extends React.Component { diff --git a/src/components/port/RetryBtn.js b/src/components/port/RetryBtn.js new file mode 100644 index 00000000..daf0223b --- /dev/null +++ b/src/components/port/RetryBtn.js @@ -0,0 +1,23 @@ +import styled from 'styled-components' + +import { Btn } from '../common' + +const RetryBtn = styled(Btn)` + margin-left: 2.4rem; + background-color: rgba(126, 97, 248, 0.4); + background-image: none; + color: ${({ theme }) => theme.colors.light}; + font-size: 1.3rem; + letter-spacing: 0.4px; + min-width: 108px; + padding-top: 0.7rem; + padding-bottom: 0.7rem; + box-shadow: none; + + &:hover, + &:focus { + opacity: 0.8; + } +` + +export default RetryBtn From f34acf59e130987ce93ab916c24bf63b25909381 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Wed, 20 Feb 2019 17:01:46 -0300 Subject: [PATCH 34/47] Add placeholder message when Port section is empty --- src/components/port/Port.js | 128 ++++++++++++++++++++++++------------ 1 file changed, 87 insertions(+), 41 deletions(-) diff --git a/src/components/port/Port.js b/src/components/port/Port.js index bfd43cc8..f9156ebe 100644 --- a/src/components/port/Port.js +++ b/src/components/port/Port.js @@ -9,12 +9,14 @@ import RetryImportDrawer from './RetryImportDrawer' import OngoingImports from './OngoingImports' import FailedImports from './FailedImports' import PortDrawer from './PortDrawer' +import PortIcon from '../icons/PortIcon' const Container = styled.div` display: flex; padding: 3.2rem 4.8rem; align-items: stretch; flex-direction: column; + justify-content: center; @media (min-width: 1000px) { align-items: flex-start; @@ -46,6 +48,7 @@ const BtnContainer = styled.div` margin-bottom: 3.2rem; order: -1; align-self: center; + text-align: center; @media (min-width: 1000px) { margin-top: 7.2rem; @@ -59,6 +62,34 @@ const BtnContainer = styled.div` const PortBtn = styled(Btn)` min-width: 200px; ` +const NoPortsContainer = styled.div` + margin-top: 3.2rem; + max-width: 32rem; + display: flex; + flex-direction: column; + align-items: center; + + @media (min-width: 1000px) { + margin-top: -5rem; + } +` + +const NoPortsTitle = styled.div` + margin-top: 3.4rem; + font-weight: 600; + font-size: 2.4rem; + line-height: 3.2rem; + text-align: center; + opacity: 0.75; +` + +const NoPortsMessage = styled.div` + margin-top: 0.8rem; + margin-bottom: 3.2rem; + font-size: 1.6rem; + line-height: 2.4rem; + text-align: center; +` class Port extends React.Component { static propTypes = { @@ -102,52 +133,67 @@ class Port extends React.Component { }) } + // eslint-disable-next-line complexity render() { return ( - - {this.props.failedImports.length > 0 && ( - - Failed Ports - - Resubmit incomplete ports that failed to excecute by clicking - Retry. - - - - )} - - {this.props.ongoingImports.length > 0 && ( - - Ongoing Ports - - An Import Request requires at least{' '} - - {this.props.attestationThreshold}{' '} - {this.props.attestationThreshold > 1 - ? 'validations' - : 'validation'} - {' '} - for the MET to be imported on this chain. - - - - )} - - + {(this.props.failedImports.length > 0 || + this.props.ongoingImports.length > 0) && ( + + {this.props.failedImports.length > 0 && ( + + Failed Ports + + Resubmit incomplete ports that failed to execute by clicking + Retry. + + + + )} + + {this.props.ongoingImports.length > 0 && ( + + Ongoing Ports + + An Import Request requires at least{' '} + + {this.props.attestationThreshold}{' '} + {this.props.attestationThreshold > 1 + ? 'validations' + : 'validation'} + {' '} + for the MET to be imported on this chain. + + + + )} + + )} + {this.props.failedImports.length === 0 && + this.props.ongoingImports.length === 0 && ( + + + You have no pending ports + + Port your Metronome between any of the other supported + chains. + + + )} + Date: Wed, 20 Feb 2019 17:29:48 -0300 Subject: [PATCH 35/47] Remove morden and ropsten configuration --- public/config/etcMorden.js | 29 ----------------------------- public/config/ethRopsten.js | 29 ----------------------------- 2 files changed, 58 deletions(-) delete mode 100644 public/config/etcMorden.js delete mode 100644 public/config/ethRopsten.js diff --git a/public/config/etcMorden.js b/public/config/etcMorden.js deleted file mode 100644 index 26d5babe..00000000 --- a/public/config/etcMorden.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -const MetronomeContracts = require('metronome-contracts') -const contracts = MetronomeContracts.morden - -module.exports = { - displayName: 'ETC (Morden)', - chainId: 2, - symbol: 'ETC', - - // contracts addresses - tokenPorterAddress: contracts.TokenPorter.address, - converterAddress: contracts.AutonomousConverter.address, - validatorAddress: contracts.Validator.address, - metTokenAddress: contracts.METToken.address, - auctionAddress: contracts.Auctions.address, - - // urls - explorerUrl: 'https://mordenexplorer.ethertrack.io/tx/{{hash}}', - indexerUrl: 'https://indexer.metronome.io', // TODO: update! - metApiUrl: 'https://api.metronome.io/', // TODO: update! - wsApiUrl: 'wss://eth.wallet.metronome.io:8546', // TODO: update! - - // defauls - coinDefaultGasLimit: '21000', - metDefaultGasLimit: '250000', - defaultGasPrice: '1000000000', - maxGasPrice: '20000000000000000' -} diff --git a/public/config/ethRopsten.js b/public/config/ethRopsten.js deleted file mode 100644 index 5823105b..00000000 --- a/public/config/ethRopsten.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -const MetronomeContracts = require('metronome-contracts') -const contracts = MetronomeContracts.ropsten - -module.exports = { - displayName: 'ETH (Ropsten)', - chainId: 3, - symbol: 'ETH', - - // contracts addresses - tokenPorterAddress: contracts.TokenPorter.address, - converterAddress: contracts.AutonomousConverter.address, - validatorAddress: contracts.Validator.address, - metTokenAddress: contracts.METToken.address, - auctionAddress: contracts.Auctions.address, - - // urls - explorerUrl: 'https://ropsten.etherscan.io/tx/{{hash}}', - indexerUrl: 'https://indexer.metronome.io', // TODO: update! - metApiUrl: 'https://api.metronome.io/', // TODO: update! - wsApiUrl: 'wss://eth.wallet.metronome.io:8546', // TODO: update! - - // defauls - coinDefaultGasLimit: '21000', - metDefaultGasLimit: '250000', - defaultGasPrice: '1000000000', - maxGasPrice: '20000000000000000' -} From cf054ca5765bc2af9f9da8da367261c146f82e68 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Wed, 20 Feb 2019 18:10:23 -0300 Subject: [PATCH 36/47] Update core and ui-logic versions --- package-lock.json | 2162 +++++++++++++++++++++------------------------ package.json | 4 +- 2 files changed, 1019 insertions(+), 1147 deletions(-) diff --git a/package-lock.json b/package-lock.json index 12915c18..953496f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,13 +66,13 @@ } }, "@babel/generator": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", - "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.3.tgz", + "integrity": "sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A==", "requires": { - "@babel/types": "^7.3.2", + "@babel/types": "^7.3.3", "jsesc": "^2.5.1", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "source-map": "^0.5.0", "trim-right": "^1.0.1" }, @@ -125,6 +125,18 @@ "@babel/types": "^7.0.0" } }, + "@babel/helper-create-class-features-plugin": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.2.tgz", + "integrity": "sha512-tdW8+V8ceh2US4GsYdNVNoohq5uVwOf9k6krjwW4E1lINcHgttnWcNqgdoessn12dAy8QkbezlbQh2nXISNY+A==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.2.3" + } + }, "@babel/helper-define-map": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", @@ -292,9 +304,9 @@ } }, "@babel/parser": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", - "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==" + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.3.tgz", + "integrity": "sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.2.0", @@ -307,27 +319,22 @@ } }, "@babel/plugin-proposal-class-properties": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz", - "integrity": "sha512-/PCJWN+CKt5v1xcGn4vnuu13QDoV+P7NcICP44BoonAJoPSGwVkgrXihFIQGiEjjPlUDBIw1cM7wYFLARS2/hw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz", + "integrity": "sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0", - "@babel/plugin-syntax-class-properties": "^7.0.0" + "@babel/helper-create-class-features-plugin": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-proposal-decorators": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.6.tgz", - "integrity": "sha512-U42f8KhUbtlhUDyV/wK4Rq/wWh8vWyttYABckG/v0vVnMPvayOewZC/83CbVdmyP+UhEqI368FEQ7hHMfhBpQA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.3.0.tgz", + "integrity": "sha512-3W/oCUmsO43FmZIqermmq6TKaRSYhmh/vybPfVFwQWdSb8xwki38uAIvknCRzuyHRuYfCYmJzL9or1v0AffPjg==", "requires": { + "@babel/helper-create-class-features-plugin": "^7.3.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/plugin-syntax-decorators": "^7.1.0" + "@babel/plugin-syntax-decorators": "^7.2.0" } }, "@babel/plugin-proposal-json-strings": { @@ -403,14 +410,6 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz", - "integrity": "sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, "@babel/plugin-syntax-decorators": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", @@ -420,9 +419,9 @@ } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0.tgz", - "integrity": "sha512-Gt9xNyRrCHCiyX/ZxDGOcBnlJl0I3IWicpZRC4CdC0P5a/I07Ya2OAMEBU+J7GmRFVmIetqEYRko6QYRuKOESw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -468,9 +467,9 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.2.0.tgz", - "integrity": "sha512-WhKr6yu6yGpGcNMVgIBuI9MkredpVc7Y3YR4UzEZmDztHoL6wV56YBHLhWnjO1EvId1B32HrD3DRFc+zSoKI1g==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", + "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -511,9 +510,9 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz", - "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.3.3.tgz", + "integrity": "sha512-n0CLbsg7KOXsMF4tSTLCApNMoXk0wOPb0DYfsOO1e7SfIb9gOyfbpKI2MZ+AXfqvlfzq2qsflJ1nEns48Caf2w==", "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-define-map": "^7.1.0", @@ -526,9 +525,9 @@ }, "dependencies": { "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==" + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==" } } }, @@ -604,12 +603,12 @@ } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.1.6.tgz", - "integrity": "sha512-0tyFAAjJmnRlr8MVJV39ASn1hv+PbdVP71hf7aAseqLfQ0o9QXk9htbMbq7/ZYXnUIp6gDw0lUUP0+PQMbbtmg==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.2.3.tgz", + "integrity": "sha512-xnt7UIk9GYZRitqCnsVMjQK1O2eKZwFB3CvvHjf5SGx6K6vr/MScCKQDnf1DxRaj501e3pXjti+inbSXX2ZUoQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0" + "@babel/plugin-syntax-flow": "^7.2.0" } }, "@babel/plugin-transform-for-of": { @@ -700,9 +699,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz", - "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.3.3.tgz", + "integrity": "sha512-IrIP25VvXWu/VlBWTpsjGptpomtIkYrN/3aDp4UKm7xK6UxZY88kcJ1UwETbzHAlwN21MnNfwlar0u8y3KpiXw==", "requires": { "@babel/helper-call-delegate": "^7.1.0", "@babel/helper-get-function-arity": "^7.0.0", @@ -773,9 +772,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz", - "integrity": "sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz", + "integrity": "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", @@ -993,9 +992,9 @@ } }, "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==" + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==" }, "ms": { "version": "2.1.1", @@ -1005,12 +1004,12 @@ } }, "@babel/types": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", - "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.3.tgz", + "integrity": "sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==", "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "to-fast-properties": "^2.0.0" }, "dependencies": { @@ -1246,9 +1245,9 @@ } }, "@types/node": { - "version": "10.12.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.24.tgz", - "integrity": "sha512-GWWbvt+z9G5otRBW8rssOFgRY87J9N/qbhqfjMZ+gUuL6zoL+Hm6gP/8qQBG4jjimqdaNLCehcVapZ/Fs2WjCQ==" + "version": "10.12.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.26.tgz", + "integrity": "sha512-nMRqS+mL1TOnIJrL6LKJcNZPB8V3eTfRo9FQA2b5gDvrHurC8XbSA86KNe0dShlEL7ReWJv/OU9NL7Z0dnqWTg==" }, "@types/q": { "version": "1.5.1", @@ -1514,9 +1513,9 @@ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" }, "ajv": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", - "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -1530,9 +1529,9 @@ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" }, "ajv-keywords": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", - "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" }, "alphanum-sort": { "version": "1.0.2", @@ -2068,12 +2067,12 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.4.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.7.tgz", - "integrity": "sha512-qS5wW6aXHkm53Y4z73tFGsUhmZu4aMPV9iHXYlF0c/wxjknXNHuj/1cIQb+6YH692DbJGGWcckAXX+VxKvahMA==", + "version": "9.4.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.8.tgz", + "integrity": "sha512-DIhd0KMi9Nql3oJkJ2HCeOVihrXFPtWXc6ckwaUNwliDOt9OGr0fk8vV8jCLWXnZc1EXvQ2uLUzGpcPxFAQHEQ==", "requires": { "browserslist": "^4.4.1", - "caniuse-lite": "^1.0.30000932", + "caniuse-lite": "^1.0.30000938", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", "postcss": "^7.0.14", @@ -2376,46 +2375,6 @@ "find-up": "^2.1.0", "istanbul-lib-instrument": "^1.10.1", "test-exclude": "^4.2.1" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - } } }, "babel-plugin-jest-hoist": { @@ -2424,18 +2383,18 @@ "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=" }, "babel-plugin-macros": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.4.2.tgz", - "integrity": "sha512-NBVpEWN4OQ/bHnu1fyDaAaTPAjnhXCEPqr1RwqxrU7b6tZ2hypp+zX4hlNfmVGfClD5c3Sl6Hfj5TJNF5VG5aA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.0.tgz", + "integrity": "sha512-BWw0lD0kVZAXRD3Od1kMrdmfudqzDzYv2qrN3l2ISR1HVp1EgLKfbOrYV9xmY5k3qx3RIu5uPAUZZZHpo0o5Iw==", "requires": { "cosmiconfig": "^5.0.5", "resolve": "^1.8.1" } }, "babel-plugin-named-asset-import": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.0.tgz", - "integrity": "sha512-to6Shd/r8fMRRg/MaOhDNfqpuXfjlQx3ypWDG6jh4ESCVZDJCgdgIalZbrnVlBPGgH/QeyHMjnGb2W+JJiy+NQ==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.1.tgz", + "integrity": "sha512-vzZlo+yEB5YHqI6CRRTDojeT43J3Wf3C/MVkZW5UlbSeIIVUYRKtxaFT2L/VTv9mbIyatCW39+9g/SZolvwRUQ==" }, "babel-plugin-styled-components": { "version": "1.10.0", @@ -2680,9 +2639,9 @@ } }, "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.20.tgz", - "integrity": "sha512-bWQ8e7LsgdFpyHU/RabjDAjVhL7KLAJXEt0nb0LANFje8YAGA8RlZv88a72aCswOxELWULkYuJqfFoKgs58Tng==" + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, "babel-plugin-transform-regenerator": { "version": "6.26.0", @@ -2742,44 +2701,56 @@ } }, "babel-preset-react-app": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-7.0.0.tgz", - "integrity": "sha512-LQKCB3xxdhAlRbk6IIZdO4ry1yA8gKGVV4phjOIgCEQr3oyaLPXf2j+lfD0zljOE2wkN2axRGOLTzdUPzVDO4w==", - "requires": { - "@babel/core": "7.1.6", - "@babel/plugin-proposal-class-properties": "7.1.0", - "@babel/plugin-proposal-decorators": "7.1.6", - "@babel/plugin-proposal-object-rest-spread": "7.0.0", - "@babel/plugin-syntax-dynamic-import": "7.0.0", - "@babel/plugin-transform-classes": "7.1.0", - "@babel/plugin-transform-destructuring": "7.1.3", - "@babel/plugin-transform-flow-strip-types": "7.1.6", - "@babel/plugin-transform-react-constant-elements": "7.0.0", - "@babel/plugin-transform-react-display-name": "7.0.0", - "@babel/plugin-transform-runtime": "7.1.0", - "@babel/preset-env": "7.1.6", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-7.0.1.tgz", + "integrity": "sha512-cic2V+GftWwt82XNMKGxvkFAVvuaBISy0/mzNLLPlALXXJxUvxJgVy2DI8HVk311oewJsmBiu/unE4wINUCvkg==", + "requires": { + "@babel/core": "7.2.2", + "@babel/plugin-proposal-class-properties": "7.3.0", + "@babel/plugin-proposal-decorators": "7.3.0", + "@babel/plugin-proposal-object-rest-spread": "7.3.2", + "@babel/plugin-syntax-dynamic-import": "7.2.0", + "@babel/plugin-transform-classes": "7.2.2", + "@babel/plugin-transform-destructuring": "7.3.2", + "@babel/plugin-transform-flow-strip-types": "7.2.3", + "@babel/plugin-transform-react-constant-elements": "7.2.0", + "@babel/plugin-transform-react-display-name": "7.2.0", + "@babel/plugin-transform-runtime": "7.2.0", + "@babel/preset-env": "7.3.1", "@babel/preset-react": "7.0.0", "@babel/preset-typescript": "7.1.0", - "@babel/runtime": "7.1.5", - "babel-loader": "8.0.4", + "@babel/runtime": "7.3.1", + "babel-loader": "8.0.5", "babel-plugin-dynamic-import-node": "2.2.0", - "babel-plugin-macros": "2.4.2", - "babel-plugin-transform-react-remove-prop-types": "0.4.20" - }, - "dependencies": { - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz", - "integrity": "sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0" + "babel-plugin-macros": "2.5.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/core": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", + "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helpers": "^7.2.0", + "@babel/parser": "^7.2.2", + "@babel/template": "^7.2.2", + "@babel/traverse": "^7.2.2", + "@babel/types": "^7.2.2", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" } }, "@babel/plugin-transform-classes": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz", - "integrity": "sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz", + "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-define-map": "^7.1.0", @@ -2791,96 +2762,95 @@ "globals": "^11.1.0" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.3.tgz", - "integrity": "sha512-Mb9M4DGIOspH1ExHOUnn2UUXFOyVTiX84fXCd+6B5iWrQg/QMeeRmSwpZ9lnjYLSXtZwiw80ytVMr3zue0ucYw==", + "babel-loader": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", + "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "util.promisify": "^1.0.0" } }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.0.0.tgz", - "integrity": "sha512-z8yrW4KCVcqPYr0r9dHXe7fu3daLzn0r6TQEFoGbXahdrzEwT1d1ux+/EnFcqIHv9uPilUlnRnPIUf7GMO0ehg==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "ms": "^2.1.1" } }, - "@babel/plugin-transform-react-display-name": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0.tgz", - "integrity": "sha512-BX8xKuQTO0HzINxT6j/GiCwoJB0AOMs0HmLbEnAvcte8U8rSkNa/eSCAY+l1OA4JnCVq2jw2p6U8QQryy2fTPg==", + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" } }, - "@babel/preset-env": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.1.6.tgz", - "integrity": "sha512-YIBfpJNQMBkb6MCkjz/A9J76SNCSuGVamOVBgoUkLzpJD/z8ghHi9I42LQ4pulVX68N/MmImz6ZTixt7Azgexw==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.1.0", - "@babel/plugin-proposal-json-strings": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.0.0", - "@babel/plugin-syntax-async-generators": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.1.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.1.5", - "@babel/plugin-transform-classes": "^7.1.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-dotall-regex": "^7.0.0", - "@babel/plugin-transform-duplicate-keys": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.1.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.1.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-amd": "^7.1.0", - "@babel/plugin-transform-modules-commonjs": "^7.1.0", - "@babel/plugin-transform-modules-systemjs": "^7.0.0", - "@babel/plugin-transform-modules-umd": "^7.1.0", - "@babel/plugin-transform-new-target": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.1.0", - "@babel/plugin-transform-parameters": "^7.1.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typeof-symbol": "^7.0.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "browserslist": "^4.1.0", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.3.0" - } - }, - "@babel/runtime": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.5.tgz", - "integrity": "sha512-xKnPpXG/pvK1B90JkwwxSGii90rQGKtzcMt2gI5G6+M0REXaq6rOHsGC2ay6/d0Uje7zzvSzjEzfR3ENhFlrfA==", - "requires": { - "regenerator-runtime": "^0.12.0" + "locate-path": "^3.0.0" } }, "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==" + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==" }, - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -2925,9 +2895,9 @@ } }, "core-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", - "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==" + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" }, "json5": { "version": "0.5.1", @@ -2959,9 +2929,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", - "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==" + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" } } }, @@ -3621,6 +3591,11 @@ "yallist": "^3.0.2" } }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", @@ -3724,9 +3699,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000935", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz", - "integrity": "sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ==" + "version": "1.0.30000938", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000938.tgz", + "integrity": "sha512-ekW8NQ3/FvokviDxhdKLZZAx7PptXNwxKgXtnR5y+PR3hckwuP3yJ1Ir+4/c97dsHNqtAyfKUGdw8P4EYzBNgw==" }, "capture-exit": { "version": "1.2.0", @@ -3778,9 +3753,9 @@ "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==" }, "chokidar": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", - "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", + "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -4437,16 +4412,6 @@ "restore-cursor": "^2.0.0" } }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, "cli-truncate": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", @@ -4618,9 +4583,9 @@ } }, "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, "combined-stream": { "version": "1.0.7", @@ -4676,11 +4641,11 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, "compressible": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", - "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.16.tgz", + "integrity": "sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA==", "requires": { - "mime-db": ">= 1.36.0 < 2" + "mime-db": ">= 1.38.0 < 2" } }, "compression": { @@ -4910,13 +4875,14 @@ } }, "cosmiconfig": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", - "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz", + "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==", "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.9.0", + "lodash.get": "^4.4.2", "parse-json": "^4.0.0" } }, @@ -5171,9 +5137,9 @@ "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=" }, "css-what": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", - "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" }, "cssdb": { "version": "4.3.0", @@ -5186,12 +5152,12 @@ "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" }, "cssnano": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.8.tgz", - "integrity": "sha512-5GIY0VzAHORpbKiL3rMXp4w4M1Ki+XlXgEXyuWXVd3h6hlASb+9Vo76dNP56/elLMVBBsUfusCo1q56uW0UWig==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", "requires": { "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.6", + "cssnano-preset-default": "^4.0.7", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" }, @@ -5217,39 +5183,39 @@ } }, "cssnano-preset-default": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.6.tgz", - "integrity": "sha512-UPboYbFaJFtDUhJ4fqctThWbbyF4q01/7UhsZbLzp35l+nUxtzh1SifoVlEfyLM3n3Z0htd8B1YlCxy9i+bQvg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", "requires": { "css-declaration-sorter": "^4.0.1", "cssnano-util-raw-cache": "^4.0.1", "postcss": "^7.0.0", - "postcss-calc": "^7.0.0", - "postcss-colormin": "^4.0.2", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.1", + "postcss-discard-comments": "^4.0.2", "postcss-discard-duplicates": "^4.0.2", "postcss-discard-empty": "^4.0.1", "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.10", - "postcss-merge-rules": "^4.0.2", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.1", - "postcss-minify-params": "^4.0.1", - "postcss-minify-selectors": "^4.0.1", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.1", - "postcss-normalize-positions": "^4.0.1", - "postcss-normalize-repeat-style": "^4.0.1", - "postcss-normalize-string": "^4.0.1", - "postcss-normalize-timing-functions": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", "postcss-normalize-unicode": "^4.0.1", "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.1", - "postcss-ordered-values": "^4.1.1", - "postcss-reduce-initial": "^4.0.2", - "postcss-reduce-transforms": "^4.0.1", - "postcss-svgo": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", "postcss-unique-selectors": "^4.0.1" }, "dependencies": { @@ -5346,9 +5312,9 @@ "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==" }, "cssstyle": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", - "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz", + "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==", "requires": { "cssom": "0.3.x" } @@ -5747,10 +5713,11 @@ } }, "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "requires": { + "arrify": "^1.0.1", "path-type": "^3.0.0" }, "dependencies": { @@ -5832,19 +5799,12 @@ } }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" - } + "domelementtype": "^1.3.0", + "entities": "^1.1.1" } }, "dom-walk": { @@ -5994,66 +5954,202 @@ "sanitize-filename": "^1.6.1", "update-notifier": "^2.5.0", "yargs": "^12.0.1" - } - }, - "electron-builder-lib": { - "version": "20.22.0", - "resolved": "https://registry.npmjs.org/electron-builder-lib/-/electron-builder-lib-20.22.0.tgz", - "integrity": "sha512-pMSJ6YEmwhwnfq6v4XE7xT07eKGZIRVaM0yN86VBP0I3GBaUZHr02+G/+QBZxjr/sInnkkWvjLSwLoo/WRanjQ==", - "dev": true, - "requires": { - "7zip-bin": "~4.0.2", - "app-builder-bin": "1.11.2", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.5", - "builder-util": "5.16.2", - "builder-util-runtime": "4.4.1", - "chromium-pickle-js": "^0.2.0", - "debug": "^3.1.0", - "ejs": "^2.6.1", - "electron-osx-sign": "0.4.10", - "electron-publish": "20.22.2", - "env-paths": "^1.0.0", - "fs-extra-p": "^4.6.1", - "hosted-git-info": "^2.7.1", - "is-ci": "^1.1.0", - "isbinaryfile": "^3.0.2", - "js-yaml": "^3.12.0", - "lazy-val": "^1.0.3", - "minimatch": "^3.0.4", - "normalize-package-data": "^2.4.0", - "plist": "^3.0.1", - "read-config-file": "3.1.0", - "sanitize-filename": "^1.6.1", - "semver": "^5.5.0", - "sumchecker": "^2.0.2", - "temp-file": "^3.1.3" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "ms": "^2.1.1" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, - "sumchecker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", - "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "debug": "^2.2.0" - }, - "dependencies": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", + "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "electron-builder-lib": { + "version": "20.22.0", + "resolved": "https://registry.npmjs.org/electron-builder-lib/-/electron-builder-lib-20.22.0.tgz", + "integrity": "sha512-pMSJ6YEmwhwnfq6v4XE7xT07eKGZIRVaM0yN86VBP0I3GBaUZHr02+G/+QBZxjr/sInnkkWvjLSwLoo/WRanjQ==", + "dev": true, + "requires": { + "7zip-bin": "~4.0.2", + "app-builder-bin": "1.11.2", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.5", + "builder-util": "5.16.2", + "builder-util-runtime": "4.4.1", + "chromium-pickle-js": "^0.2.0", + "debug": "^3.1.0", + "ejs": "^2.6.1", + "electron-osx-sign": "0.4.10", + "electron-publish": "20.22.2", + "env-paths": "^1.0.0", + "fs-extra-p": "^4.6.1", + "hosted-git-info": "^2.7.1", + "is-ci": "^1.1.0", + "isbinaryfile": "^3.0.2", + "js-yaml": "^3.12.0", + "lazy-val": "^1.0.3", + "minimatch": "^3.0.4", + "normalize-package-data": "^2.4.0", + "plist": "^3.0.1", + "read-config-file": "3.1.0", + "sanitize-filename": "^1.6.1", + "semver": "^5.5.0", + "sumchecker": "^2.0.2", + "temp-file": "^3.1.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "dev": true, + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -6470,9 +6566,9 @@ } }, "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", "dev": true }, "escape-html": { @@ -6486,9 +6582,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", - "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", "requires": { "esprima": "^3.1.3", "estraverse": "^4.2.0", @@ -6572,9 +6668,9 @@ } }, "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==" + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==" }, "ms": { "version": "2.1.1", @@ -6615,9 +6711,9 @@ } }, "eslint-config-react-app": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-3.0.6.tgz", - "integrity": "sha512-VL5rA1EBZv7f9toc9x71or7nr4jRmwCH4V9JKB9DFVaTLOLI9+vjWLgQLjMu3xR9iUT80dty86RbCfNaKyrFFg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-3.0.7.tgz", + "integrity": "sha512-Mmmc9lIY/qvX6OEV09+ZLqVTz1aX8VVCrgCjBHXdmMGaC+pldD+87oj3BiJWXMSfcYs5iOo9gy0mGnQ8f/fMsQ==", "requires": { "confusing-browser-globals": "^1.0.5" } @@ -6702,14 +6798,6 @@ "isarray": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6726,36 +6814,6 @@ "strip-bom": "^3.0.0" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -6998,13 +7056,13 @@ } }, "ethereumjs-util": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.0.0.tgz", - "integrity": "sha512-E3yKUyl0Fs95nvTFQZe/ZSNcofhDzUsDlA5y2uoRmf1+Ec7gpGhNCsgKkZBRh7Br5op8mJcYF/jFbmjj909+nQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", + "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", "requires": { "bn.js": "^4.11.0", "create-hash": "^1.1.2", - "ethjs-util": "^0.1.6", + "ethjs-util": "0.1.6", "keccak": "^1.0.2", "rlp": "^2.0.0", "safe-buffer": "^5.1.1", @@ -7122,11 +7180,11 @@ "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" }, "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "requires": { - "original": ">=0.0.5" + "original": "^1.0.0" } }, "evp_bytestokey": { @@ -7147,12 +7205,12 @@ } }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -7160,12 +7218,14 @@ "strip-eof": "^1.0.0" }, "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "pump": "^3.0.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } } } @@ -7196,14 +7256,6 @@ "fill-range": "^2.1.0" } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, "expect": { "version": "22.4.3", "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", @@ -7906,11 +7958,11 @@ "dev": true }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^3.0.0" + "locate-path": "^2.0.0" } }, "flat-cache": { @@ -7939,20 +7991,25 @@ } }, "follow-redirects": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", - "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", "requires": { - "debug": "=3.1.0" + "debug": "^3.2.6" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -8931,25 +8988,28 @@ } }, "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "^3.0.0" } }, "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } } }, "globals": { @@ -8958,12 +9018,12 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, "globby": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", "requires": { "array-union": "^1.0.1", - "dir-glob": "^2.0.0", + "dir-glob": "2.0.0", "fast-glob": "^2.0.2", "glob": "^7.1.2", "ignore": "^3.3.5", @@ -9115,11 +9175,11 @@ }, "dependencies": { "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.11" } } } @@ -9346,14 +9406,6 @@ "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==", "dev": true }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "requires": { - "parse-passwd": "^1.0.0" - } - }, "hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -9837,12 +9889,45 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -9852,6 +9937,40 @@ "ci-info": "^2.0.0" } }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -9951,9 +10070,9 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, "immer": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.7.2.tgz", - "integrity": "sha512-4Urocwu9+XLDJw4Tc6ZCg7APVjjLInCFvO4TwGsAYV5zT6YYSor14dsZR0+0tHlDIN92cFUOq+i7fC00G5vTxA==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", + "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" }, "import-cwd": { "version": "2.1.0", @@ -10091,9 +10210,9 @@ } }, "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ip": { "version": "1.1.5", @@ -10497,11 +10616,11 @@ }, "dependencies": { "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.11" } } } @@ -10628,48 +10747,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, "jest-cli": { "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", @@ -10713,62 +10790,6 @@ "yargs": "^11.0.0" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -10776,38 +10797,6 @@ "requires": { "ansi-regex": "^3.0.0" } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "requires": { - "camelcase": "^4.1.0" - } } } }, @@ -11180,109 +11169,11 @@ "source-map": "^0.5.7" } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -11292,38 +11183,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "requires": { - "camelcase": "^4.1.0" - } } } }, @@ -11652,11 +11511,11 @@ "integrity": "sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg==" }, "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "^2.0.0" + "invert-kv": "^1.0.0" } }, "left-pad": { @@ -11786,6 +11645,21 @@ "ms": "^2.1.1" } }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -11952,6 +11826,15 @@ } } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -12280,11 +12163,11 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, @@ -12313,6 +12196,11 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -12544,13 +12432,11 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" + "mimic-fn": "^1.0.0" } }, "memoize-one": { @@ -12657,9 +12543,9 @@ "integrity": "sha512-qGh4HFRqRL5tr4KuR3aoJi6FW81V2r/u/ZxCcgpOdkxqGy92jh1isBxySRwLagNctYF/tbxJljxSGRAQ57sKkg==" }, "metronome-wallet-core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/metronome-wallet-core/-/metronome-wallet-core-2.0.1.tgz", - "integrity": "sha512-KTW/Pr4FbbNfNsyQdpSQRFpIXh48KNyf3lqlsLBGNRBPJ9GZmp4WHbs41d2ulhnY9NMOSBnhNi+qWTHSo7DD7Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/metronome-wallet-core/-/metronome-wallet-core-2.0.2.tgz", + "integrity": "sha512-yyBaY2sGs7giRjTRYA7YpqlcZm/K+6nJtwN70GkzIk4bXiEPcNI0GVkxslABd9TNGA4grgjo3uKMc+x0xiODgA==", "requires": { "axios": "^0.18.0", "axios-cookiejar-support": "^0.4.2", @@ -12711,9 +12597,9 @@ } }, "metronome-wallet-ui-logic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/metronome-wallet-ui-logic/-/metronome-wallet-ui-logic-2.1.0.tgz", - "integrity": "sha512-K+WkyPQo1BrwGmAsL68UN8BkbqvCWjnkYTdiYr7mR1xyu0Gc4L7rfbaMKAwChiFq1hhKfvrRWgKbtsN/SRoI4w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/metronome-wallet-ui-logic/-/metronome-wallet-ui-logic-3.0.0.tgz", + "integrity": "sha512-3N9OSVe2YoBe+8IMeguU58kY/qEgnfZholyyMZ8sRq5djXVYy2nlIgTXf1rWyh4iNHmwTTRihswhihF8fK57Vw==", "requires": { "babel-preset-es2015": "^6.24.1", "bignumber.js": "^6.0.0", @@ -12775,18 +12661,11 @@ "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "requires": { - "mime-db": "~1.37.0" - }, - "dependencies": { - "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" - } + "mime-db": "~1.38.0" } }, "mimic-fn": { @@ -13167,9 +13046,9 @@ } }, "node-releases": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.7.tgz", - "integrity": "sha512-bKdrwaqJUPHqlCzDD7so/R+Nk0jGv9a11ZhLrD9f6i947qGLrGAhU3OxRENa19QQmwzGy/g6zCDEuLGDO8HPvA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.8.tgz", + "integrity": "sha512-gQm+K9mGCiT/NXHy+V/ZZS1N/LOaGGqRAAJJs3X9Ah1g+CIbRcBgNyoNYQ+SEtcyAtB9KqDruu+fF7nWjsqRaA==", "requires": { "semver": "^5.3.0" } @@ -13362,9 +13241,9 @@ "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" }, "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" }, "object-visit": { "version": "1.0.1", @@ -13529,13 +13408,13 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -13564,19 +13443,19 @@ "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==" }, "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -13601,9 +13480,9 @@ } }, "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "package-json": { "version": "4.0.1", @@ -13662,9 +13541,9 @@ } }, "parse-asn1": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", - "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", @@ -13720,11 +13599,6 @@ "json-parse-better-errors": "^1.0.1" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, "parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", @@ -13939,46 +13813,6 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - } } }, "pkg-up": { @@ -13987,46 +13821,6 @@ "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "requires": { "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - } } }, "please-upgrade-node": { @@ -14312,9 +14106,9 @@ } }, "postcss-colormin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.2.tgz", - "integrity": "sha512-1QJc2coIehnVFsz0otges8kQLsryi4lo19WD+U5xCWvXd0uw/Z+KKYnbiNDCnO9GP+PvErPHCG0jNvWTngk9Rw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "requires": { "browserslist": "^4.0.0", "color": "^3.0.0", @@ -14488,9 +14282,9 @@ } }, "postcss-discard-comments": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.1.tgz", - "integrity": "sha512-Ay+rZu1Sz6g8IdzRjUgG2NafSNpp2MSMOQUb+9kkzzzP+kh07fP0yNbhtFejURnyVXSX3FYy2nVNW1QTnNjgBQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "requires": { "postcss": "^7.0.0" }, @@ -14995,9 +14789,9 @@ } }, "postcss-merge-longhand": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.10.tgz", - "integrity": "sha512-hME10s6CSjm9nlVIcO1ukR7Jr5RisTaaC1y83jWCivpuBtPohA3pZE7cGTIVSYjXvLnXozHTiVOkG4dnnl756g==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "requires": { "css-color-names": "0.0.4", "postcss": "^7.0.0", @@ -15026,9 +14820,9 @@ } }, "postcss-merge-rules": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.2.tgz", - "integrity": "sha512-UiuXwCCJtQy9tAIxsnurfF0mrNHKc4NnNx6NxqmzNNjXpQwLSukUxELHTRF0Rg1pAmcoKLih8PwvZbiordchag==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "requires": { "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", @@ -15098,9 +14892,9 @@ } }, "postcss-minify-gradients": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.1.tgz", - "integrity": "sha512-pySEW3E6Ly5mHm18rekbWiAjVi/Wj8KKt2vwSfVFAWdW6wOIekgqxKxLU7vJfb107o3FDNPkaYFCxGAJBFyogA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "is-color-stop": "^1.0.0", @@ -15129,9 +14923,9 @@ } }, "postcss-minify-params": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.1.tgz", - "integrity": "sha512-h4W0FEMEzBLxpxIVelRtMheskOKKp52ND6rJv+nBS33G1twu2tCyurYj/YtgU76+UDCvWeNs0hs8HFAWE2OUFg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "requires": { "alphanum-sort": "^1.0.0", "browserslist": "^4.0.0", @@ -15162,9 +14956,9 @@ } }, "postcss-minify-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.1.tgz", - "integrity": "sha512-8+plQkomve3G+CodLCgbhAKrb5lekAnLYuL1d7Nz+/7RANpBEVdgBkPNwljfSKvZ9xkkZTZITd04KP+zeJTJqg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "requires": { "alphanum-sort": "^1.0.0", "has": "^1.0.0", @@ -15294,9 +15088,9 @@ } }, "postcss-normalize-display-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", - "integrity": "sha512-R5mC4vaDdvsrku96yXP7zak+O3Mm9Y8IslUobk7IMP+u/g+lXvcN4jngmHY5zeJnrQvE13dfAg5ViU05ZFDwdg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "requires": { "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", @@ -15324,9 +15118,9 @@ } }, "postcss-normalize-positions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.1.tgz", - "integrity": "sha512-GNoOaLRBM0gvH+ZRb2vKCIujzz4aclli64MBwDuYGU2EY53LwiP7MxOZGE46UGtotrSnmarPPZ69l2S/uxdaWA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "has": "^1.0.0", @@ -15355,9 +15149,9 @@ } }, "postcss-normalize-repeat-style": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.1.tgz", - "integrity": "sha512-fFHPGIjBUyUiswY2rd9rsFcC0t3oRta4wxE1h3lpwfQZwFeFjXFSiDtdJ7APCmHQOnUZnqYBADNRPKPwFAONgA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "cssnano-util-get-match": "^4.0.0", @@ -15386,9 +15180,9 @@ } }, "postcss-normalize-string": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.1.tgz", - "integrity": "sha512-IJoexFTkAvAq5UZVxWXAGE0yLoNN/012v7TQh5nDo6imZJl2Fwgbhy3J2qnIoaDBrtUP0H7JrXlX1jjn2YcvCQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "requires": { "has": "^1.0.0", "postcss": "^7.0.0", @@ -15416,9 +15210,9 @@ } }, "postcss-normalize-timing-functions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.1.tgz", - "integrity": "sha512-1nOtk7ze36+63ONWD8RCaRDYsnzorrj+Q6fxkQV+mlY5+471Qx9kspqv0O/qQNMeApg8KNrRf496zHwJ3tBZ7w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "requires": { "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", @@ -15507,9 +15301,9 @@ } }, "postcss-normalize-whitespace": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.1.tgz", - "integrity": "sha512-U8MBODMB2L+nStzOk6VvWWjZgi5kQNShCyjRhMT3s+W9Jw93yIjOnrEkKYD3Ul7ChWbEcjDWmXq0qOL9MIAnAw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" @@ -15536,9 +15330,9 @@ } }, "postcss-ordered-values": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.1.tgz", - "integrity": "sha512-PeJiLgJWPzkVF8JuKSBcylaU+hDJ/TX3zqAMIjlghgn1JBi6QwQaDZoDIlqWRcCAI8SxKrt3FCPSRmOgKRB97Q==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "postcss": "^7.0.0", @@ -15741,9 +15535,9 @@ } }, "postcss-reduce-initial": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.2.tgz", - "integrity": "sha512-epUiC39NonKUKG+P3eAOKKZtm5OtAtQJL7Ye0CBN1f+UQTHzqotudp+hki7zxXm7tT0ZAKDMBj1uihpPjP25ug==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "requires": { "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", @@ -15772,9 +15566,9 @@ } }, "postcss-reduce-transforms": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.1.tgz", - "integrity": "sha512-sZVr3QlGs0pjh6JAIe6DzWvBaqYw05V1t3d9Tp+VnFRT5j+rsqoWsysh/iSD7YNsULjq9IAylCznIwVd5oU/zA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "requires": { "cssnano-util-get-match": "^4.0.0", "has": "^1.0.0", @@ -15934,9 +15728,9 @@ } }, "postcss-svgo": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.1.tgz", - "integrity": "sha512-YD5uIk5NDRySy0hcI+ZJHwqemv2WiqqzDgtvgMzO8EGSkK5aONyX8HMVFRFJSdO8wUWTuisUFn/d7yRRbBr5Qw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "requires": { "is-svg": "^3.0.0", "postcss": "^7.0.0", @@ -16169,12 +15963,13 @@ } }, "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" } }, "proxy-addr": { @@ -16359,9 +16154,9 @@ } }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { "safe-buffer": "^5.1.0" } @@ -16455,21 +16250,21 @@ } }, "react-app-polyfill": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-0.2.0.tgz", - "integrity": "sha512-uBfocjRsBNqhTaEywUZ2buzhHbor2jBbnhZY8VUZ7VZ3PXucIPZrPDAAmbclELhvl+x08PbynAGQfMYcBmqZ2w==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-0.2.1.tgz", + "integrity": "sha512-rcpR+WKmLOoYGDAxXaLlxl5Sw6jqbcD1qg2Okn1Ta2RHCxLuQv75B9Em2L2GvuOTx3lAxDpNl/TYGWbKnO/Aag==", "requires": { - "core-js": "2.5.7", + "core-js": "2.6.4", "object-assign": "4.1.1", "promise": "8.0.2", - "raf": "3.4.0", + "raf": "3.4.1", "whatwg-fetch": "3.0.0" }, "dependencies": { "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", + "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==" }, "promise": { "version": "8.0.2", @@ -16478,82 +16273,57 @@ "requires": { "asap": "~2.0.6" } - }, - "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", - "requires": { - "performance-now": "^2.1.0" - } } } }, "react-dev-utils": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-7.0.1.tgz", - "integrity": "sha512-AN/RKZKHsyB2FebKSyMLOecvjuzZ54lzsLYF8wNmwwgRA3dVC4vhYsafvME7JD4q7RUB0bejqFWjOS9QtN48Zg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-7.0.3.tgz", + "integrity": "sha512-KEFsH1CewnmddPLXIuU+QWKTH/hpJKZClL2+74XN54NkPnR2KnB5gGmuQ0E7DwcCkUpdMxxqBX+rB7aB5sZS4A==", "requires": { "@babel/code-frame": "7.0.0", "address": "1.0.3", - "browserslist": "4.1.1", - "chalk": "2.4.1", + "browserslist": "4.4.1", + "chalk": "2.4.2", "cross-spawn": "6.0.5", "detect-port-alt": "1.1.6", "escape-string-regexp": "1.0.5", "filesize": "3.6.1", "find-up": "3.0.0", - "global-modules": "1.0.0", - "globby": "8.0.1", + "global-modules": "2.0.0", + "globby": "8.0.2", "gzip-size": "5.0.0", - "immer": "1.7.2", - "inquirer": "6.2.0", + "immer": "1.10.0", + "inquirer": "6.2.1", "is-root": "2.0.0", - "loader-utils": "1.1.0", + "loader-utils": "1.2.3", "opn": "5.4.0", "pkg-up": "2.0.0", - "react-error-overlay": "^5.1.2", + "react-error-overlay": "^5.1.3", "recursive-readdir": "2.2.2", "shell-quote": "1.6.1", - "sockjs-client": "1.1.5", - "strip-ansi": "4.0.0", + "sockjs-client": "1.3.0", + "strip-ansi": "5.0.0", "text-table": "0.2.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "browserslist": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.1.1.tgz", - "integrity": "sha512-VBorw+tgpOtZ1BYhrVSVTzTt/3+vSE3eFUh0N2GCFK1HffceOaf32YS/bs6WiFhjDAblAFrx85jMy3BG9fBK2Q==", - "requires": { - "caniuse-lite": "^1.0.30000884", - "electron-to-chromium": "^1.3.62", - "node-releases": "^1.0.0-alpha.11" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "locate-path": "^3.0.0" } }, "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", @@ -16566,31 +16336,46 @@ "run-async": "^2.2.0", "rxjs": "^6.1.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" } }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "p-limit": "^2.0.0" } }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.0.0" } } } @@ -16607,9 +16392,9 @@ } }, "react-error-overlay": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.2.tgz", - "integrity": "sha512-7kEBKwU9R8fKnZJBRa5RSIfay4KJwnYvKB6gODGicUmDSAhQJ7Tdnll5S0RLtYrzRfMVXlqYw61rzrSpP4ThLQ==" + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.3.tgz", + "integrity": "sha512-GoqeM3Xadie7XUApXOjkY3Qhs8RkwB/Za4WMedBGrOKH1eTuKGyoAECff7jiVonJchOx6KZ9i8ILO5XIoHB+Tg==" }, "react-hint": { "version": "3.1.0", @@ -16617,9 +16402,9 @@ "integrity": "sha512-plCDiMmoV2b5f7dJExgjaANYpfQCYtaKPbxT3oEcrKbTl0RO7D9gvUZVQeW+OzsZjd+4/V3zATvN7+09r5ix0A==" }, "react-is": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.1.tgz", - "integrity": "sha512-ioMCzVDWvCvKD8eeT+iukyWrBGrA3DiFYkXfBsVYIRdaREZuBjENG+KjrikavCLasozqRWTwFUagU/O4vPpRMA==" + "version": "16.8.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.2.tgz", + "integrity": "sha512-D+NxhSR2HUCjYky1q1DwpNUD44cDpUXzSmmFyC3ug1bClcU/iDNy0YNn1iwme28fn+NFhpA13IndOd42CrFb+Q==" }, "react-lifecycles-compat": { "version": "3.0.4", @@ -17184,9 +16969,9 @@ } }, "realpath-native": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", - "integrity": "sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "requires": { "util.promisify": "^1.0.0" } @@ -17283,14 +17068,9 @@ } }, "regexp-tree": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.1.tgz", - "integrity": "sha512-HwRjOquc9QOwKTgbxvZTcddS5mlNlwePMQ3NFL8broajMLD5CXDAqas8Y5yxJH5QtZp5iRor3YCILd5pz71Cgw==", - "requires": { - "cli-table3": "^0.5.0", - "colors": "^1.1.2", - "yargs": "^12.0.5" - } + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.5.tgz", + "integrity": "sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ==" }, "regexpp": { "version": "2.0.1", @@ -17445,21 +17225,21 @@ } }, "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", "requires": { - "lodash": "^4.13.1" + "lodash": "^4.17.11" } }, "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" } }, "require-directory": { @@ -17532,15 +17312,6 @@ "resolve-from": "^3.0.0" } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", @@ -18601,16 +18372,31 @@ } }, "sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", "json3": "^3.3.2", - "url-parse": "^1.1.8" + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, "sort-keys": { @@ -19073,9 +18859,9 @@ } }, "stylehacks": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.1.tgz", - "integrity": "sha512-TK5zEPeD9NyC1uPIdjikzsgWxdQQN/ry1X3d1iOz1UkYDCmcr928gWD1KHgyC27F50UnE0xCTrBOO1l6KR8M4w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "requires": { "browserslist": "^4.0.0", "postcss": "^7.0.0", @@ -19159,13 +18945,6 @@ "stable": "~0.1.6", "unquote": "~1.1.1", "util.promisify": "~1.0.0" - }, - "dependencies": { - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - } } }, "swarm-js": { @@ -19319,34 +19098,6 @@ "dev": true, "requires": { "execa": "^0.7.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } } }, "terser": { @@ -19391,6 +19142,44 @@ "pkg-dir": "^3.0.0" } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -19813,6 +19602,11 @@ "commander": "~2.13.0", "source-map": "~0.6.1" } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" } } }, @@ -19957,9 +19751,9 @@ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unorm": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", - "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.5.0.tgz", + "integrity": "sha512-sMfSWoiRaXXeDZSXC+YRZ23H4xchQpwxjpw1tmfR+kgbBCaOgln4NI0LXejJIhnBuKINrB3WRn+ZI8IWssirVw==" }, "unpipe": { "version": "1.0.0", @@ -20261,9 +20055,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", - "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", "dev": true }, "isemail": { @@ -21024,12 +20818,34 @@ "xregexp": "4.0.0" } }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { - "original": "^1.0.0" + "pump": "^3.0.0" } }, "import-local": { @@ -21041,11 +20857,74 @@ "resolve-cwd": "^2.0.0" } }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", + "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" + } + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -21054,19 +20933,6 @@ "find-up": "^3.0.0" } }, - "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - } - }, "yargs": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", @@ -21451,9 +21317,9 @@ } }, "ws": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", - "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", "requires": { "async-limiter": "~1.0.0" } @@ -21548,9 +21414,9 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yaeti": { "version": "0.0.6", @@ -21563,31 +21429,37 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "requires": { "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "os-locale": "^2.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } } }, "yauzl": { diff --git a/package.json b/package.json index 822d180d..860e46f5 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,8 @@ "json-stringify-safe": "5.0.1", "lodash": "4.17.11", "metronome-contracts": "2.0.0", - "metronome-wallet-core": "2.0.1", - "metronome-wallet-ui-logic": "autonomoussoftware/metronome-wallet-ui-logic#port-reloaded", + "metronome-wallet-core": "2.0.2", + "metronome-wallet-ui-logic": "3.0.0", "nedb": "1.8.0", "p-timeout": "2.0.1", "qrcode.react": "0.7.2", From 0d851b6f7899478e2e68f8e199d8624b6c6cd8a9 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Wed, 20 Feb 2019 18:29:24 -0300 Subject: [PATCH 37/47] Fix comment position --- public/main/client/handlers/multi-core.js | 28 ++++++++++++----------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/public/main/client/handlers/multi-core.js b/public/main/client/handlers/multi-core.js index 31481a61..4bfa82aa 100644 --- a/public/main/client/handlers/multi-core.js +++ b/public/main/client/handlers/multi-core.js @@ -54,7 +54,8 @@ function onLoginSubmit (data, cores) { const findCoreByChainName = (cores, chain) => cores.find(e => e.chain === chain) -const findCoreBySymbol = (cores, ticker) => cores.find(e => e.config.symbol === ticker) +const findCoreBySymbol = (cores, ticker) => + cores.find(e => e.config.symbol === ticker) function getPortFees (data, cores) { const exportCore = findCoreByChainName(cores, data.chain) @@ -67,15 +68,17 @@ function getPortFees (data, cores) { ) } -const withMerkleRoot = fn => function (data, cores) { - const exportCore = findCoreBySymbol(cores, data.originChain) - const importCore = findCoreByChainName(cores, data.chain) - return singleCore.getMerkleRoot(data.burnSequence, exportCore) - .then(function (root) { - const importData = Object.assign({}, data, { root }) - return fn(importData, importCore) - }) -} +const withMerkleRoot = fn => + function (data, cores) { + const exportCore = findCoreBySymbol(cores, data.originChain) + const importCore = findCoreByChainName(cores, data.chain) + return singleCore + .getMerkleRoot(data.burnSequence, exportCore) + .then(function (root) { + const importData = Object.assign({}, data, { root }) + return fn(importData, importCore) + }) + } const importMetronome = (data, cores) => withMerkleRoot(singleCore.importMetronome)(data, cores) @@ -97,9 +100,8 @@ function portMetronome (data, cores) { Object.keys(receipt.events) .filter(e => !receipt.events[e].event) // Filter already parsed event keys .map(e => receipt.events[e]) // Get not parsed events - .map(e => exportCore.coreApi.explorer.tryParseEventLog(e)) - ) // Try to parse each event - .find(e => e.parsed.event === 'LogExportReceipt') // Get LogExportReceipt event + .map(e => exportCore.coreApi.explorer.tryParseEventLog(e)) // Try to parse each event + ).find(e => e.parsed.event === 'LogExportReceipt') // Get LogExportReceipt event if (!parsedExportReceipt || !parsedExportReceipt.parsed) { return Promise.reject( new WalletError('There was an error trying to parse export receipt') From a6480b127f77a9eb059e0217e25b4029e8bc7b58 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Thu, 21 Feb 2019 12:14:01 -0300 Subject: [PATCH 38/47] Add changePassword methods and logic. --- public/main/client/auth.js | 12 ++++++++++-- public/main/client/handlers/no-core.js | 3 +++ public/main/client/subscriptions/no-core.js | 1 + src/client/index.js | 1 + 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/public/main/client/auth.js b/public/main/client/auth.js index 9b93b22f..d0f4929c 100644 --- a/public/main/client/auth.js +++ b/public/main/client/auth.js @@ -12,8 +12,8 @@ function setPassword (password) { const passwordHash = getPasswordHash() if (!passwordHash) { logger.info('No password set, using current as default') - return hash(password).then(setPasswordHash) } + return hash(password).then(setPasswordHash) } function isValidPassword (password) { @@ -47,4 +47,12 @@ function isValidPassword (password) { }) } -module.exports = { isValidPassword, setPassword } +function changePassword ({ oldPassword, newPassword }) { + const isValid = isValidPassword(oldPassword) + if (isValid) { + setPassword(newPassword) + } + return isValid +} + +module.exports = { isValidPassword, setPassword, changePassword } diff --git a/public/main/client/handlers/no-core.js b/public/main/client/handlers/no-core.js index 68af2766..1d7646bc 100644 --- a/public/main/client/handlers/no-core.js +++ b/public/main/client/handlers/no-core.js @@ -8,6 +8,8 @@ const auth = require('../auth') const validatePassword = data => auth.isValidPassword(data) +const changePassword = data => auth.changePassword(data) + function clearCache () { logger.verbose('Clearing database cache') return dbManager @@ -20,6 +22,7 @@ const persistState = data => storage.persistState(data).then(() => true) module.exports = { validatePassword, + changePassword, persistState, clearCache } diff --git a/public/main/client/subscriptions/no-core.js b/public/main/client/subscriptions/no-core.js index 9cd98166..6aa54321 100644 --- a/public/main/client/subscriptions/no-core.js +++ b/public/main/client/subscriptions/no-core.js @@ -5,6 +5,7 @@ const utils = require('./utils') const listeners = { 'validate-password': handlers.validatePassword, + 'change-password': handlers.changePassword, 'persist-state': handlers.persistState, 'clear-cache': handlers.clearCache } diff --git a/src/client/index.js b/src/client/index.js index ad32b778..fc5584d9 100644 --- a/src/client/index.js +++ b/src/client/index.js @@ -101,6 +101,7 @@ function createClient(createStore) { convertCoin: utils.forwardToMainProcess('convert-coin', 750000), retryImport: utils.forwardToMainProcess('retry-import', 750000), convertMet: utils.forwardToMainProcess('convert-met', 750000), + changePassword: utils.forwardToMainProcess('change-password'), onLoginSubmit: utils.forwardToMainProcess('login-submit'), getPortFees: utils.forwardToMainProcess('get-port-fees'), getGasLimit: utils.forwardToMainProcess('get-gas-limit'), From 9239c29b34a18c9e5426158519a3042ed0000642 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Thu, 21 Feb 2019 15:07:16 -0300 Subject: [PATCH 39/47] Add seed encryption to change password --- public/main/client/auth.js | 10 +--------- public/main/client/handlers/no-core.js | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/public/main/client/auth.js b/public/main/client/auth.js index d0f4929c..4a037498 100644 --- a/public/main/client/auth.js +++ b/public/main/client/auth.js @@ -47,12 +47,4 @@ function isValidPassword (password) { }) } -function changePassword ({ oldPassword, newPassword }) { - const isValid = isValidPassword(oldPassword) - if (isValid) { - setPassword(newPassword) - } - return isValid -} - -module.exports = { isValidPassword, setPassword, changePassword } +module.exports = { isValidPassword, setPassword } diff --git a/public/main/client/handlers/no-core.js b/public/main/client/handlers/no-core.js index 1d7646bc..c72fe1df 100644 --- a/public/main/client/handlers/no-core.js +++ b/public/main/client/handlers/no-core.js @@ -5,11 +5,10 @@ const dbManager = require('../database') const logger = require('../../../logger') const storage = require('../storage') const auth = require('../auth') +const wallet = require('../wallet') const validatePassword = data => auth.isValidPassword(data) -const changePassword = data => auth.changePassword(data) - function clearCache () { logger.verbose('Clearing database cache') return dbManager @@ -20,6 +19,18 @@ function clearCache () { const persistState = data => storage.persistState(data).then(() => true) +function changePassword (data) { + const isValid = validatePassword(data) + if (isValid) { + wallet.getWallets().forEach(function (walletId) { + const seed = wallet.getSeed(walletId, data.oldPassword) + auth.setPassword(data.newPassword) + wallet.setSeed(seed, data.newPassword) + }) + } + return isValid +} + module.exports = { validatePassword, changePassword, From 47ec0aa9c91edb21734f738ff76881ea8994fc72 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Thu, 21 Feb 2019 15:17:07 -0300 Subject: [PATCH 40/47] Fix validatePassword param --- public/main/client/handlers/no-core.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/main/client/handlers/no-core.js b/public/main/client/handlers/no-core.js index c72fe1df..cef8549c 100644 --- a/public/main/client/handlers/no-core.js +++ b/public/main/client/handlers/no-core.js @@ -19,13 +19,13 @@ function clearCache () { const persistState = data => storage.persistState(data).then(() => true) -function changePassword (data) { - const isValid = validatePassword(data) +function changePassword ({ oldPassword, newPassword }) { + const isValid = validatePassword(oldPassword) if (isValid) { wallet.getWallets().forEach(function (walletId) { - const seed = wallet.getSeed(walletId, data.oldPassword) - auth.setPassword(data.newPassword) - wallet.setSeed(seed, data.newPassword) + const seed = wallet.getSeed(walletId, oldPassword) + auth.setPassword(newPassword) + wallet.setSeed(seed, newPassword) }) } return isValid From 97bf6c8513098b5f82c5643e0a88be6ac2e72c79 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Thu, 21 Feb 2019 15:48:12 -0300 Subject: [PATCH 41/47] Add UI for password change --- src/components/ChangePassword.js | 143 ++++++++++++++++++ src/components/Router.js | 2 + .../{onboarding => common}/EntropyMeter.js | 5 +- src/components/common/index.js | 2 + src/components/onboarding/PasswordStep.js | 3 +- src/components/tools/Tools.js | 13 +- 6 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 src/components/ChangePassword.js rename src/components/{onboarding => common}/EntropyMeter.js (94%) diff --git a/src/components/ChangePassword.js b/src/components/ChangePassword.js new file mode 100644 index 00000000..4456932e --- /dev/null +++ b/src/components/ChangePassword.js @@ -0,0 +1,143 @@ +import withChangePasswordState from 'metronome-wallet-ui-logic/src/hocs/withChangePasswordState' +import { withRouter } from 'react-router-dom' +import * as utils from 'metronome-wallet-ui-logic/src/utils' +import PropTypes from 'prop-types' +import styled from 'styled-components' +import React from 'react' + +import { EntropyMeter, DarkLayout, TextInput, Btn, Sp } from './common' +import { ToastsContext } from '../components/toasts' + +const Container = styled.div` + padding: 3.2rem 2.4rem; + max-width: 45rem; + + @media (min-width: 800px) { + padding: 3.2rem 4.8rem; + } +` + +const PasswordMessage = styled.div` + font-size: 1.6rem; + font-weight: 600; + line-height: 1.5; + margin-top: 3.2rem; +` + +const Green = styled.div` + display: inline-block; + color: ${p => p.theme.colors.success}; +` + +const ErrorMessage = styled.div` + color: ${p => p.theme.colors.danger} + font-size: 1.2rem; + margin-top: 2.4rem; + margin-bottom: -3.9rem; +` + +class ChangePassword extends React.Component { + static propTypes = { + requiredPasswordEntropy: PropTypes.number.isRequired, + newPasswordAgain: PropTypes.string, + onInputChange: PropTypes.func.isRequired, + newPassword: PropTypes.string, + oldPassword: PropTypes.string, + onSubmit: PropTypes.func.isRequired, + history: PropTypes.shape({ + push: PropTypes.func.isRequired + }).isRequired, + status: PropTypes.oneOf(['init', 'pending', 'success', 'failure']), + errors: utils.errorPropTypes( + 'newPasswordAgain', + 'newPassword', + 'oldPassword' + ), + error: PropTypes.string + } + + static contextType = ToastsContext + + handleSubmitAndNavigate = e => { + e.preventDefault() + this.props.onSubmit() + } + + componentDidUpdate(prevProps) { + if (this.props.status === 'success' && prevProps.status !== 'success') { + this.props.history.push('/tools') + this.context.toast('success', 'Password successfully changed') + } + } + + render() { + return ( + + + + + + + + Enter a strong password until the meter turns green + . + + + + {!this.props.errors.newPassword && ( + + )} + + + + + {this.props.error && ( + {this.props.error} + )} + + + Change Password + + + + + + ) + } +} + +export default withRouter(withChangePasswordState(ChangePassword)) diff --git a/src/components/Router.js b/src/components/Router.js index f1f4f10f..66eb854b 100644 --- a/src/components/Router.js +++ b/src/components/Router.js @@ -3,6 +3,7 @@ import styled, { keyframes } from 'styled-components' import React from 'react' import OfflineWarning from './OfflineWarning' +import ChangePassword from './ChangePassword' import Dashboard from './dashboard/Dashboard' import Converter from './converter/Converter' import Sidebar from './sidebar/Sidebar' @@ -52,6 +53,7 @@ export const layout = ( + diff --git a/src/components/onboarding/EntropyMeter.js b/src/components/common/EntropyMeter.js similarity index 94% rename from src/components/onboarding/EntropyMeter.js rename to src/components/common/EntropyMeter.js index bd83b8c6..6aa10ff6 100644 --- a/src/components/onboarding/EntropyMeter.js +++ b/src/components/common/EntropyMeter.js @@ -12,6 +12,7 @@ import React from 'react' * ratio >= 1 -> green * * @param {number} ratio passwordEntropy / targetEntropy ratio + * @returns {number} interpolated CSS hue value between red & green */ function getHue(ratio) { // Hues are adapted to match the theme's success and danger colors @@ -53,8 +54,8 @@ const Message = styled.div` p.ratio >= 1 ? p.theme.colors.success : p.ratio >= 0.75 - ? 'hsla(40, 100%, 50%, 0.75)' - : p.theme.colors.danger}; + ? 'hsla(40, 100%, 50%, 0.75)' + : p.theme.colors.danger}; text-shadow: ${p => p.theme.textShadow}; text-align: right; margin-bottom: -18px; diff --git a/src/components/common/index.js b/src/components/common/index.js index 29087093..f0feb775 100644 --- a/src/components/common/index.js +++ b/src/components/common/index.js @@ -3,6 +3,7 @@ import TextInput, { Label } from './TextInput' import ConfirmationWizard from './ConfirmationWizard' import DisplayValue from './DisplayValue' import AmountFields from './AmountFields' +import EntropyMeter from './EntropyMeter' import LastUpdated from './LastUpdated' import ItemFilter from './ItemFilter' import DarkLayout from './DarkLayout' @@ -22,6 +23,7 @@ export { ConfirmationWizard, DisplayValue, AmountFields, + EntropyMeter, LastUpdated, ItemFilter, DarkLayout, diff --git a/src/components/onboarding/PasswordStep.js b/src/components/onboarding/PasswordStep.js index 7452d63b..d921c2ad 100644 --- a/src/components/onboarding/PasswordStep.js +++ b/src/components/onboarding/PasswordStep.js @@ -3,8 +3,7 @@ import PropTypes from 'prop-types' import styled from 'styled-components' import React from 'react' -import { TextInput, AltLayout, Btn, Sp } from '../common' -import EntropyMeter from './EntropyMeter' +import { EntropyMeter, TextInput, AltLayout, Btn, Sp } from '../common' import Message from './Message' const PasswordMessage = styled(Message)` diff --git a/src/components/tools/Tools.js b/src/components/tools/Tools.js index 2ab41957..1985f1e9 100644 --- a/src/components/tools/Tools.js +++ b/src/components/tools/Tools.js @@ -1,5 +1,5 @@ +import { withRouter, NavLink } from 'react-router-dom' import withToolsState from 'metronome-wallet-ui-logic/src/hocs/withToolsState' -import { withRouter } from 'react-router-dom' import PropTypes from 'prop-types' import styled from 'styled-components' import React from 'react' @@ -101,6 +101,17 @@ class Tools extends React.Component {
+ +
+

Change Password

+

+ This will allow you to change the password you use to access the + wallet. +

+ + Change Password + +

Rescan Transactions List

From 34d71e980c70d5682f2c67a876abec04d741b62e Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Thu, 21 Feb 2019 16:11:40 -0300 Subject: [PATCH 42/47] Change max width in password change form --- src/components/ChangePassword.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ChangePassword.js b/src/components/ChangePassword.js index 4456932e..fbb38e12 100644 --- a/src/components/ChangePassword.js +++ b/src/components/ChangePassword.js @@ -10,7 +10,7 @@ import { ToastsContext } from '../components/toasts' const Container = styled.div` padding: 3.2rem 2.4rem; - max-width: 45rem; + max-width: 50rem; @media (min-width: 800px) { padding: 3.2rem 4.8rem; From bae438f29193162c315f86bd5c6b0a452162aea8 Mon Sep 17 00:00:00 2001 From: Martin Carrera Date: Thu, 21 Feb 2019 16:22:26 -0300 Subject: [PATCH 43/47] Fix validatePassword to be async --- public/main/client/handlers/no-core.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/public/main/client/handlers/no-core.js b/public/main/client/handlers/no-core.js index cef8549c..b78bf80e 100644 --- a/public/main/client/handlers/no-core.js +++ b/public/main/client/handlers/no-core.js @@ -20,15 +20,17 @@ function clearCache () { const persistState = data => storage.persistState(data).then(() => true) function changePassword ({ oldPassword, newPassword }) { - const isValid = validatePassword(oldPassword) - if (isValid) { - wallet.getWallets().forEach(function (walletId) { - const seed = wallet.getSeed(walletId, oldPassword) - auth.setPassword(newPassword) - wallet.setSeed(seed, newPassword) + return validatePassword(oldPassword) + .then(function (isValid) { + if (isValid) { + wallet.getWallets().forEach(function (walletId) { + const seed = wallet.getSeed(walletId, oldPassword) + auth.setPassword(newPassword) + wallet.setSeed(seed, newPassword) + }) + } + return isValid }) - } - return isValid } module.exports = { From 9e5a031c4b8eb6b0b1fc5bf6fc6c19fa46d56c3a Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Thu, 21 Feb 2019 17:27:27 -0300 Subject: [PATCH 44/47] Update metronome-wallet-ui-logic dependency --- package-lock.json | 50 ++++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index 953496f5..c99d1a9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6294,9 +6294,9 @@ } }, "electron-log": { - "version": "2.2.17", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-2.2.17.tgz", - "integrity": "sha512-v+Af5W5z99ehhaLOfE9eTSXUwjzh2wFlQjz51dvkZ6ZIrET6OB/zAZPvsuwT6tm3t5x+M1r+Ed3U3xtPZYAyuQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-3.0.1.tgz", + "integrity": "sha512-bomFcrYvkEXj0H00T5GjBee50TBA/VwdoDFpPQ2jz3LDGi+4wKF3xrB+N1qXiZYoqDeaK5lNRAkNsHKmXeCPfg==" }, "electron-osx-sign": { "version": "0.4.10", @@ -12597,9 +12597,9 @@ } }, "metronome-wallet-ui-logic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/metronome-wallet-ui-logic/-/metronome-wallet-ui-logic-3.0.0.tgz", - "integrity": "sha512-3N9OSVe2YoBe+8IMeguU58kY/qEgnfZholyyMZ8sRq5djXVYy2nlIgTXf1rWyh4iNHmwTTRihswhihF8fK57Vw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/metronome-wallet-ui-logic/-/metronome-wallet-ui-logic-3.1.0.tgz", + "integrity": "sha512-gTLNiIJnfZjOiwrwm6tt0SsQojC93+XLQy1A8PXKqLG5KiF/FI4bafOtAlsk49ql+gVGUM/BjzHNMaCSNy+TtA==", "requires": { "babel-preset-es2015": "^6.24.1", "bignumber.js": "^6.0.0", @@ -19482,14 +19482,6 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, "ua-parser-js": { "version": "0.7.19", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", @@ -20397,8 +20389,19 @@ "integrity": "sha512-8p6ZLv+1JYa5Vs8oBn33Nn3VGFBbF+wVfO+b78RJS1Qf1uIOzjFVDk3XwYDD7rlz9G5BKpxhaQw+6EGQ7L02aw==", "requires": { "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.37", - "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" + "web3-core-helpers": "1.0.0-beta.37" + }, + "dependencies": { + "websocket": { + "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", + "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", + "requires": { + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" + } + } } }, "web3-shh": { @@ -21002,16 +21005,6 @@ "source-map": "~0.6.1" } }, - "websocket": { - "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", - "requires": { - "debug": "^2.2.0", - "nan": "^2.3.3", - "typedarray-to-buffer": "^3.1.2", - "yaeti": "^0.0.6" - } - }, "websocket-driver": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", @@ -21418,11 +21411,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" - }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/package.json b/package.json index 609bd533..15bcb49e 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "lodash": "4.17.11", "metronome-contracts": "2.0.0", "metronome-wallet-core": "2.0.2", - "metronome-wallet-ui-logic": "3.0.0", + "metronome-wallet-ui-logic": "3.1.0", "nedb": "1.8.0", "p-timeout": "2.0.1", "qrcode.react": "0.7.2", From e7bc09a850caabfdcc14be12adc4e4b18a87dd18 Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Fri, 22 Feb 2019 12:21:18 -0300 Subject: [PATCH 45/47] Hide multi-chain UI when using single chain --- package.json | 2 +- src/components/Loading.js | 10 +++++-- src/components/Router.js | 21 ++++++++++--- src/components/dashboard/tx-list/Filter.js | 15 ++++++---- src/components/dashboard/tx-list/Header.js | 20 ++++++++----- src/components/dashboard/tx-list/TxList.js | 2 ++ src/components/sidebar/PrimaryNav.js | 22 +++++++++----- src/components/sidebar/Sidebar.js | 34 +++++++++++++++------- 8 files changed, 87 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index 15bcb49e..ea851b10 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "lodash": "4.17.11", "metronome-contracts": "2.0.0", "metronome-wallet-core": "2.0.2", - "metronome-wallet-ui-logic": "3.1.0", + "metronome-wallet-ui-logic": "3.2.0", "nedb": "1.8.0", "p-timeout": "2.0.1", "qrcode.react": "0.7.2", diff --git a/src/components/Loading.js b/src/components/Loading.js index 51ced9cd..9a46deb8 100644 --- a/src/components/Loading.js +++ b/src/components/Loading.js @@ -11,6 +11,7 @@ const ChecklistContainer = styled(Flex.Row)` ` const Title = styled.div` + display: ${p => (p.isMultiChain ? 'block' : 'none')}; font-weight: 600; font-size: 0.9rem; letter-spacing: 1.6px; @@ -20,11 +21,12 @@ const Title = styled.div` ` const Checklist = styled.div` - padding-left: 4.8rem; + padding-left: ${p => (p.isMultiChain ? '4.8rem' : 0)}; ` class Loading extends React.Component { static propTypes = { + isMultiChain: PropTypes.bool.isRequired, chainsStatus: PropTypes.objectOf( PropTypes.shape({ hasBlockHeight: PropTypes.bool, @@ -44,8 +46,10 @@ class Loading extends React.Component { {Object.keys(this.props.chainsStatus).map(chainName => (
- {this.props.chainsStatus[chainName].displayName} - + + {this.props.chainsStatus[chainName].displayName} + + ( - +
@@ -51,17 +52,29 @@ export const layout = ( - + {isMultiChain && }
) +Layout.propTypes = { + isMultiChain: PropTypes.bool.isRequired +} + export default class Router extends React.Component { + static propTypes = { + isMultiChain: PropTypes.bool.isRequired + } + render() { - return {layout} + return ( + + + + ) } } diff --git a/src/components/dashboard/tx-list/Filter.js b/src/components/dashboard/tx-list/Filter.js index b3c74842..e3423ce9 100644 --- a/src/components/dashboard/tx-list/Filter.js +++ b/src/components/dashboard/tx-list/Filter.js @@ -39,6 +39,7 @@ const Tab = styled.button` export default class Filter extends React.Component { static propTypes = { onFilterChange: PropTypes.func.isRequired, + isMultiChain: PropTypes.bool.isRequired, activeFilter: PropTypes.oneOf([ 'converted', 'received', @@ -82,12 +83,14 @@ export default class Filter extends React.Component { > Converted - this.props.onFilterChange('ported')} - > - Ported - + {this.props.isMultiChain && ( + this.props.onFilterChange('ported')} + > + Ported + + )} ) } diff --git a/src/components/dashboard/tx-list/Header.js b/src/components/dashboard/tx-list/Header.js index e2544684..9bf0f126 100644 --- a/src/components/dashboard/tx-list/Header.js +++ b/src/components/dashboard/tx-list/Header.js @@ -1,11 +1,19 @@ +import styled, { css } from 'styled-components' import PropTypes from 'prop-types' -import styled from 'styled-components' import React from 'react' import ScanIndicator from './ScanIndicator' import { Flex } from '../../common' import Filter from './Filter' +const responsiveHeader = width => css` + @media (min-width: ${width}) { + align-items: baseline; + display: flex; + top: 6.8rem; + } +` + const Container = styled.div` position: sticky; background: ${p => p.theme.colors.primary}; @@ -16,11 +24,7 @@ const Container = styled.div` margin: 0 -4.8rem; padding: 0 4.8rem; - @media (min-width: 1140px) { - top: 6.8rem; - display: flex; - align-items: baseline; - } + ${p => responsiveHeader(p.isMultiChain ? '1140px' : '1040px')} ` const Title = styled.div` @@ -46,13 +50,14 @@ export default class Header extends React.Component { onWalletRefresh: PropTypes.func.isRequired, onFilterChange: PropTypes.func.isRequired, activeFilter: PropTypes.string.isRequired, + isMultiChain: PropTypes.bool.isRequired, onTitleClick: PropTypes.func.isRequired, syncStatus: PropTypes.oneOf(['up-to-date', 'syncing', 'failed']).isRequired } render() { return ( - + Transactions {(this.props.hasTransactions || @@ -65,6 +70,7 @@ export default class Header extends React.Component { diff --git a/src/components/dashboard/tx-list/TxList.js b/src/components/dashboard/tx-list/TxList.js index fac6d8b6..cf03618c 100644 --- a/src/components/dashboard/tx-list/TxList.js +++ b/src/components/dashboard/tx-list/TxList.js @@ -42,6 +42,7 @@ class TxList extends React.Component { static propTypes = { hasTransactions: PropTypes.bool.isRequired, onWalletRefresh: PropTypes.func.isRequired, + isMultiChain: PropTypes.bool.isRequired, syncStatus: PropTypes.oneOf(['up-to-date', 'syncing', 'failed']).isRequired, items: PropTypes.arrayOf( PropTypes.shape({ @@ -120,6 +121,7 @@ class TxList extends React.Component { onWalletRefresh={this.props.onWalletRefresh} hasTransactions={this.props.hasTransactions} onFilterChange={onFilterChange} + isMultiChain={this.props.isMultiChain} onTitleClick={this.handleClick} activeFilter={activeFilter} syncStatus={this.props.syncStatus} diff --git a/src/components/sidebar/PrimaryNav.js b/src/components/sidebar/PrimaryNav.js index 7d251d45..67c9f972 100644 --- a/src/components/sidebar/PrimaryNav.js +++ b/src/components/sidebar/PrimaryNav.js @@ -77,6 +77,7 @@ const Label = styled.span` export default class PrimaryNav extends React.Component { static propTypes = { + isMultiChain: PropTypes.bool.isRequired, parent: PropTypes.object.isRequired } @@ -113,14 +114,19 @@ export default class PrimaryNav extends React.Component { - - + {this.props.isMultiChain && ( + + )} ) } diff --git a/src/components/sidebar/Sidebar.js b/src/components/sidebar/Sidebar.js index f95de4c2..3ae57316 100644 --- a/src/components/sidebar/Sidebar.js +++ b/src/components/sidebar/Sidebar.js @@ -1,3 +1,4 @@ +import PropTypes from 'prop-types' import styled from 'styled-components' import React from 'react' @@ -34,7 +35,9 @@ const Container = styled.div` ` const LogoLargeContainer = styled.div` - padding: 2.4rem 2.4rem 2.8rem 2.4rem; + padding: ${p => + p.isMultiChain ? '2.4rem 2.4rem 2.8rem 2.4rem' : '3.2rem 3.2rem 5.6rem'}; + height: ${p => (p.isMultiChain ? 'auto' : '125px')}; display: none; flex-shrink: 0; @@ -44,7 +47,8 @@ const LogoLargeContainer = styled.div` ` const LogoSmallContainer = styled.div` - padding: 2.3rem 1.6rem 3.2rem; + padding: ${p => (p.isMultiChain ? '2.3rem 1.6rem 3.2rem' : '2.3rem 1.6rem')}; + height: ${p => (p.isMultiChain ? 'auto' : '125px')}; display: block; flex-shrink: 0; @@ -63,6 +67,7 @@ const ChainSelectorContainer = styled.div` const PrimaryNavContainer = styled.nav` flex-grow: 1; + margin-top: ${p => (p.isMultiChain ? 0 : '5rem')}; ` const SecondaryNavContainer = styled.div` @@ -87,23 +92,32 @@ const Footer = styled.div` ` export default class Sidebar extends React.Component { + static propTypes = { + isMultiChain: PropTypes.bool.isRequired + } + render() { return ( - + - + - - - - - - + {this.props.isMultiChain && ( + + + + )} + + + From e2a09d28dda42129e29c4908347aa1c2e698214b Mon Sep 17 00:00:00 2001 From: Pablo Enrici Date: Mon, 25 Feb 2019 11:54:23 -0300 Subject: [PATCH 46/47] Bump version 1.3.0 --- package-lock.json | 12 +++++------- package.json | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c99d1a9b..a7344279 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "metronome-desktop-wallet", - "version": "1.2.0", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -12597,9 +12597,9 @@ } }, "metronome-wallet-ui-logic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/metronome-wallet-ui-logic/-/metronome-wallet-ui-logic-3.1.0.tgz", - "integrity": "sha512-gTLNiIJnfZjOiwrwm6tt0SsQojC93+XLQy1A8PXKqLG5KiF/FI4bafOtAlsk49ql+gVGUM/BjzHNMaCSNy+TtA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/metronome-wallet-ui-logic/-/metronome-wallet-ui-logic-3.2.0.tgz", + "integrity": "sha512-+EeTV8UqJQacC79nE8Z97lS2NoEHKBU/7O/hEH/CuC7hLCg1jzqnv/YcTtE1h6hmXMFXZqb2dH1S46VxZnUMDw==", "requires": { "babel-preset-es2015": "^6.24.1", "bignumber.js": "^6.0.0", @@ -20397,9 +20397,7 @@ "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", "requires": { "debug": "^2.2.0", - "nan": "^2.3.3", - "typedarray-to-buffer": "^3.1.2", - "yaeti": "^0.0.6" + "nan": "^2.3.3" } } } diff --git a/package.json b/package.json index ea851b10..14ba7716 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "metronome-desktop-wallet", - "version": "1.2.0", + "version": "1.3.0", "author": { "name": "Autonomous Software", "email": "info@autonomous.sh", From 5a9e9a1ad07793217694cd2b9f7ea41bce5c9f44 Mon Sep 17 00:00:00 2001 From: Gabriel Montes Date: Mon, 25 Feb 2019 12:10:49 -0300 Subject: [PATCH 47/47] Add missing deps to lockfile --- package-lock.json | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index a7344279..c380a774 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19482,6 +19482,14 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "ua-parser-js": { "version": "0.7.19", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", @@ -20389,17 +20397,8 @@ "integrity": "sha512-8p6ZLv+1JYa5Vs8oBn33Nn3VGFBbF+wVfO+b78RJS1Qf1uIOzjFVDk3XwYDD7rlz9G5BKpxhaQw+6EGQ7L02aw==", "requires": { "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.37" - }, - "dependencies": { - "websocket": { - "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "requires": { - "debug": "^2.2.0", - "nan": "^2.3.3" - } - } + "web3-core-helpers": "1.0.0-beta.37", + "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" } }, "web3-shh": { @@ -21003,6 +21002,16 @@ "source-map": "~0.6.1" } }, + "websocket": { + "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", + "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", + "requires": { + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" + } + }, "websocket-driver": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", @@ -21409,6 +21418,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",