Merge pull request #330 from poanetwork/vb-dpath-fix

Derive correct addresses for custom networks (RSK/ETC)
This commit is contained in:
Victor Baranov 2020-03-18 18:13:44 +03:00 committed by GitHub
commit 371787abcb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 454 additions and 354 deletions

View File

@ -2,6 +2,7 @@
## Current Master ## Current Master
- [#330](https://github.com/poanetwork/nifty-wallet/pull/330) - (Fix) Derive correct addresses for custom networks (RSK/ETC)
- [#329](https://github.com/poanetwork/nifty-wallet/pull/329) - (Fix) Connect to unknown private network fix - [#329](https://github.com/poanetwork/nifty-wallet/pull/329) - (Fix) Connect to unknown private network fix
- [#326](https://github.com/poanetwork/nifty-wallet/pull/326) - (Chore) HTTP2 RPC endpoints for POA and xDai - [#326](https://github.com/poanetwork/nifty-wallet/pull/326) - (Chore) HTTP2 RPC endpoints for POA and xDai
- [#324](https://github.com/poanetwork/nifty-wallet/pull/324) - (Chore) Whitelist Geon token - [#324](https://github.com/poanetwork/nifty-wallet/pull/324) - (Chore) Whitelist Geon token

View File

@ -7,7 +7,7 @@
## Building locally ## Building locally
- Install [Node.js](https://nodejs.org/en/) version 10.16.0 and npm version 6.9.0 - Install [Node.js](https://nodejs.org/en/) version 12.x.x and npm version 6.14.2
- If you are using [nvm](https://github.com/creationix/nvm#installation) (recommended) running `nvm use` will automatically choose the right node version for you. - If you are using [nvm](https://github.com/creationix/nvm#installation) (recommended) running `nvm use` will automatically choose the right node version for you.
- Select npm 6.9.0: ```npm install -g npm@6.9.0``` - Select npm 6.9.0: ```npm install -g npm@6.9.0```
- Install dependencies: ```npm install``` - Install dependencies: ```npm install```

View File

@ -126,6 +126,7 @@ setupMetamaskMeshMetrics()
* @property {string} provider.rpcTarget - The address for the RPC API, if using an RPC API. * @property {string} provider.rpcTarget - The address for the RPC API, if using an RPC API.
* @property {string} provider.type - An identifier for the type of network selected, allows MetaMask to use custom provider strategies for known networks. * @property {string} provider.type - An identifier for the type of network selected, allows MetaMask to use custom provider strategies for known networks.
* @property {string} network - A stringified number of the current network ID. * @property {string} network - A stringified number of the current network ID.
* @property {string} dPath - A path to derive accounts.
* @property {Object} accounts - An object mapping lower-case hex addresses to objects with "balance" and "address" keys, both storing hex string values. * @property {Object} accounts - An object mapping lower-case hex addresses to objects with "balance" and "address" keys, both storing hex string values.
* @property {hex} currentBlockGasLimit - The most recently seen block gas limit, in a lower case hex prefixed string. * @property {hex} currentBlockGasLimit - The most recently seen block gas limit, in a lower case hex prefixed string.
* @property {TransactionMeta[]} selectedAddressTxList - An array of transactions associated with the currently selected account. * @property {TransactionMeta[]} selectedAddressTxList - An array of transactions associated with the currently selected account.

View File

@ -69,6 +69,15 @@ const chainTypes = {
PROD: 2, PROD: 2,
} }
const hdRSKMainnetPath = `m/44'/137'/0'/0`
const hdRSKTestnetPath = `m/44'/37310'/0'/0`
const hdETCPath = `m/44'/61'/0'/0`
const customDPaths = {}
customDPaths[RSK] = hdRSKMainnetPath
customDPaths[RSK_TESTNET] = hdRSKTestnetPath
customDPaths[CLASSIC] = hdETCPath
module.exports = { module.exports = {
POA, POA,
POA_TICK, POA_TICK,
@ -131,4 +140,5 @@ module.exports = {
DROPDOWN_RSK_DISPLAY_NAME, DROPDOWN_RSK_DISPLAY_NAME,
DROPDOWN_RSK_TESTNET_DISPLAY_NAME, DROPDOWN_RSK_TESTNET_DISPLAY_NAME,
chainTypes, chainTypes,
customDPaths,
} }

View File

@ -16,7 +16,7 @@ const ethNetProps = require('eth-net-props')
const parse = require('url-parse') const parse = require('url-parse')
const extend = require('extend') const extend = require('extend')
const networks = { networkList: {} } const networks = { networkList: {} }
const { isKnownProvider } = require('../../../../old-ui/app/util') const { isKnownProvider, getDPath } = require('../../../../old-ui/app/util')
const { const {
ROPSTEN, ROPSTEN,
@ -204,6 +204,8 @@ module.exports = class NetworkController extends EventEmitter {
const previousNetworkID = this.getNetworkState() const previousNetworkID = this.getNetworkState()
this.setNetworkState('loading') this.setNetworkState('loading')
this._configureProvider(opts) this._configureProvider(opts)
const dPath = getDPath(opts.type)
this.store.updateState({ dPath })
this.emit('networkDidChange', opts.type, previousNetworkID) this.emit('networkDidChange', opts.type, previousNetworkID)
} }

View File

@ -1,5 +1,9 @@
const ObservableStore = require('obs-store') const ObservableStore = require('obs-store')
const { warn } = require('loglevel')
import log from 'loglevel'
import { normalize as normalizeAddress } from 'eth-sig-util'
import ethUtil from 'ethereumjs-util'
// By default, poll every 3 minutes // By default, poll every 3 minutes
const DEFAULT_INTERVAL = 180 * 1000 const DEFAULT_INTERVAL = 180 * 1000
@ -14,8 +18,9 @@ class TokenRatesController {
* *
* @param {Object} [config] - Options to configure controller * @param {Object} [config] - Options to configure controller
*/ */
constructor ({ interval = DEFAULT_INTERVAL, preferences } = {}) { constructor ({ interval = DEFAULT_INTERVAL, currency, preferences } = {}) {
this.store = new ObservableStore() this.store = new ObservableStore()
this.currency = currency
this.preferences = preferences this.preferences = preferences
this.interval = interval this.interval = interval
} }
@ -24,40 +29,39 @@ class TokenRatesController {
* Updates exchange rates for all tokens * Updates exchange rates for all tokens
*/ */
async updateExchangeRates () { async updateExchangeRates () {
if (!this.isActive) { return } if (!this.isActive) {
return
}
const contractExchangeRates = {} const contractExchangeRates = {}
for (const i in this._tokens) { const nativeCurrency = this.currency ? this.currency.state.nativeCurrency.toLowerCase() : 'eth'
if (this._tokens[i]) { const pairs = this._tokens.map((token) => token.address).join(',')
const address = this._tokens[i].address const query = `contract_addresses=${pairs}&vs_currencies=${nativeCurrency}`
contractExchangeRates[address] = await this.fetchExchangeRate(address) if (this._tokens.length > 0) {
try {
const response = await fetch(`https://api.coingecko.com/api/v3/simple/token_price/ethereum?${query}`)
const prices = await response.json()
this._tokens.forEach((token) => {
const price = prices[token.address.toLowerCase()] || prices[ethUtil.toChecksumAddress(token.address)]
contractExchangeRates[normalizeAddress(token.address)] = price ? price[nativeCurrency] : 0
})
} catch (error) {
log.warn(`Nifty Wallet - TokenRatesController exchange rate fetch failed.`, error)
} }
} }
this.store.putState({ contractExchangeRates }) this.store.putState({ contractExchangeRates })
} }
/**
* Fetches a token exchange rate by address
*
* @param {String} address - Token contract address
*/
async fetchExchangeRate (address) {
try {
const response = await fetch(`https://metamask.balanc3.net/prices?from=${address}&to=ETH&autoConversion=false&summaryOnly=true`)
const json = await response.json()
return json && json.length ? json[0].averagePrice : 0
} catch (error) {
warn(`Nifty Wallet - TokenRatesController exchange rate fetch failed for ${address}.`, error)
return 0
}
}
/** /**
* @type {Number} * @type {Number}
*/ */
set interval (interval) { set interval (interval) {
this._handle && clearInterval(this._handle) this._handle && clearInterval(this._handle)
if (!interval) { return } if (!interval) {
this._handle = setInterval(() => { this.updateExchangeRates() }, interval) return
}
this._handle = setInterval(() => {
this.updateExchangeRates()
}, interval)
} }
/** /**
@ -65,10 +69,14 @@ class TokenRatesController {
*/ */
set preferences (preferences) { set preferences (preferences) {
this._preferences && this._preferences.unsubscribe() this._preferences && this._preferences.unsubscribe()
if (!preferences) { return } if (!preferences) {
return
}
this._preferences = preferences this._preferences = preferences
this.tokens = preferences.getState().tokens this.tokens = preferences.getState().tokens
preferences.subscribe(({ tokens = [] }) => { this.tokens = tokens }) preferences.subscribe(({ tokens = [] }) => {
this.tokens = tokens
})
} }
/** /**

View File

@ -1,5 +1,6 @@
const KeyringController = require('eth-keychain-controller') const KeyringController = require('eth-keychain-controller')
const log = require('loglevel') const log = require('loglevel')
const { getDPath } = require('../../../old-ui/app/util')
const seedPhraseVerifier = { const seedPhraseVerifier = {
@ -16,19 +17,20 @@ const seedPhraseVerifier = {
* @returns {Promise<void>} Promises undefined * @returns {Promise<void>} Promises undefined
* *
*/ */
verifyAccounts (createdAccounts, seedWords) { verifyAccounts (createdAccounts, seedWords, network) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!createdAccounts || createdAccounts.length < 1) { if (!createdAccounts || createdAccounts.length < 1) {
return reject(new Error('No created accounts defined.')) return reject(new Error('No created accounts defined.'))
} }
const dPath = getDPath(network)
const keyringController = new KeyringController({}) const keyringController = new KeyringController({})
const Keyring = keyringController.getKeyringClassForType('HD Key Tree') const Keyring = keyringController.getKeyringClassForType('HD Key Tree')
const opts = { const opts = {
mnemonic: seedWords, mnemonic: seedWords,
numberOfAccounts: createdAccounts.length, numberOfAccounts: createdAccounts.length,
hdPath: dPath,
} }
const keyring = new Keyring(opts) const keyring = new Keyring(opts)

View File

@ -54,7 +54,7 @@ const ethUtil = require('ethereumjs-util')
const sigUtil = require('eth-sig-util') const sigUtil = require('eth-sig-util')
const { importTypes } = require('../../old-ui/app/accounts/import/enums') const { importTypes } = require('../../old-ui/app/accounts/import/enums')
const { LEDGER, TREZOR } = require('../../old-ui/app/components/connect-hardware/enum') const { LEDGER, TREZOR } = require('../../old-ui/app/components/connect-hardware/enum')
const { ifPOA, ifRSK, getNetworkID } = require('../../old-ui/app/util') const { ifPOA, ifRSK, getNetworkID, getDPath, setDPath } = require('../../old-ui/app/util')
const { const {
CLASSIC_CODE, CLASSIC_CODE,
@ -156,23 +156,29 @@ module.exports = class MetamaskController extends EventEmitter {
// ensure accountTracker updates balances after network change // ensure accountTracker updates balances after network change
this.networkController.on('networkDidChange', (newType, previousNetworkIDStr) => { this.networkController.on('networkDidChange', (newType, previousNetworkIDStr) => {
this.accountTracker._updateAccounts() const dPath = getDPath(newType)
this.detectTokensController.restartTokenDetection() this.deriveKeyringFromNewDPath(dPath)
.then(accounts => {
this.accountTracker._updateAccounts()
this.detectTokensController.restartTokenDetection()
const previousNetworkID = parseInt(previousNetworkIDStr, 10) const previousNetworkID = parseInt(previousNetworkIDStr, 10)
const nextNetwork = getNetworkID({network: newType}) const nextNetwork = getNetworkID({network: newType})
const nextNetworkID = parseInt(nextNetwork && nextNetwork.netId, 10) const nextNetworkID = parseInt(nextNetwork && nextNetwork.netId, 10)
if (nextNetworkID !== previousNetworkID) {
if (nextNetworkID !== previousNetworkID) { const isPreviousETC = previousNetworkID === CLASSIC_CODE
const isPreviousETC = previousNetworkID === CLASSIC_CODE const isPreviousRSK = ifRSK(previousNetworkID)
const isPreviousRSK = ifRSK(previousNetworkID) const isNextETC = nextNetworkID === CLASSIC_CODE
const isNextETC = nextNetworkID === CLASSIC_CODE const isNextRSK = ifRSK(nextNetworkID)
const isNextRSK = ifRSK(nextNetworkID) if (isPreviousETC || isPreviousRSK || isNextETC || isNextRSK) {
if (isPreviousETC || isPreviousRSK || isNextETC || isNextRSK) { this.forgetDevice(LEDGER, false)
this.forgetDevice(LEDGER, false) this.forgetDevice(TREZOR, false)
this.forgetDevice(TREZOR, false) }
} }
} })
.catch(e => {
console.log(e)
})
}) })
// key mgmt // key mgmt
@ -530,7 +536,10 @@ module.exports = class MetamaskController extends EventEmitter {
// clear known identities // clear known identities
this.preferencesController.setAddresses([]) this.preferencesController.setAddresses([])
// create new vault // create new vault
const vault = await keyringController.createNewVaultAndRestore(password, seed) const network = this.networkController.getProviderConfig().type
const dPath = getDPath(network)
this.store.updateState({dPath})
const vault = await keyringController.createNewVaultAndRestore(password, seed, dPath)
const ethQuery = new EthQuery(this.provider) const ethQuery = new EthQuery(this.provider)
accounts = await keyringController.getAccounts() accounts = await keyringController.getAccounts()
@ -541,6 +550,8 @@ module.exports = class MetamaskController extends EventEmitter {
throw new Error('MetamaskController - No HD Key Tree found') throw new Error('MetamaskController - No HD Key Tree found')
} }
setDPath(primaryKeyring, network)
// seek out the first zero balance // seek out the first zero balance
while (lastBalance !== '0x0') { while (lastBalance !== '0x0') {
await keyringController.addNewAccount(primaryKeyring) await keyringController.addNewAccount(primaryKeyring)
@ -591,8 +602,24 @@ module.exports = class MetamaskController extends EventEmitter {
* @param {string} password - The user's password * @param {string} password - The user's password
* @returns {Promise<object>} - The keyringController update. * @returns {Promise<object>} - The keyringController update.
*/ */
async submitPassword (password) { async submitPassword (password, dPath) {
await this.keyringController.submitPassword(password) await this.keyringController.submitPassword(password, dPath)
const accounts = await this.keyringController.getAccounts()
// verify keyrings
const nonSimpleKeyrings = this.keyringController.keyrings.filter(keyring => keyring.type !== 'Simple Key Pair' && keyring.type !== 'Simple Address')
if (nonSimpleKeyrings.length > 1 && this.diagnostics) {
await this.diagnostics.reportMultipleKeyrings(nonSimpleKeyrings)
}
await this.preferencesController.syncAddresses(accounts)
await this.balancesController.updateAllBalances()
await this.txController.pendingTxTracker.updatePendingTxs()
return this.keyringController.fullUpdate()
}
async deriveKeyringFromNewDPath (dPath) {
await this.keyringController.deriveKeyringFromNewDPath(dPath)
const accounts = await this.keyringController.getAccounts() const accounts = await this.keyringController.getAccounts()
// verify keyrings // verify keyrings
@ -832,6 +859,8 @@ module.exports = class MetamaskController extends EventEmitter {
if (!primaryKeyring) { if (!primaryKeyring) {
throw new Error('MetamaskController - No HD Key Tree found') throw new Error('MetamaskController - No HD Key Tree found')
} }
const network = this.networkController.getProviderConfig().type
setDPath(primaryKeyring, network)
const keyringController = this.keyringController const keyringController = this.keyringController
const oldAccounts = await keyringController.getAccounts() const oldAccounts = await keyringController.getAccounts()
const keyState = await keyringController.addNewAccount(primaryKeyring) const keyState = await keyringController.addNewAccount(primaryKeyring)
@ -880,11 +909,12 @@ module.exports = class MetamaskController extends EventEmitter {
* @returns {Promise<string>} Seed phrase to be confirmed by the user. * @returns {Promise<string>} Seed phrase to be confirmed by the user.
*/ */
async verifySeedPhrase () { async verifySeedPhrase () {
const primaryKeyring = this.keyringController.getKeyringsByType('HD Key Tree')[0] const primaryKeyring = this.keyringController.getKeyringsByType('HD Key Tree')[0]
if (!primaryKeyring) { if (!primaryKeyring) {
throw new Error('MetamaskController - No HD Key Tree found') throw new Error('MetamaskController - No HD Key Tree found')
} }
const network = this.networkController.getProviderConfig().type
setDPath(primaryKeyring, network)
const serialized = await primaryKeyring.serialize() const serialized = await primaryKeyring.serialize()
const seedWords = serialized.mnemonic const seedWords = serialized.mnemonic
@ -895,7 +925,7 @@ module.exports = class MetamaskController extends EventEmitter {
} }
try { try {
await seedPhraseVerifier.verifyAccounts(accounts, seedWords) await seedPhraseVerifier.verifyAccounts(accounts, seedWords, network)
return seedWords return seedWords
} catch (err) { } catch (err) {
log.error(err.message) log.error(err.message)
@ -938,8 +968,8 @@ module.exports = class MetamaskController extends EventEmitter {
return props return props
} }
async changePassword (oldPassword, newPassword) { async changePassword (oldPassword, newPassword, dPath) {
await this.keyringController.changePassword(oldPassword, newPassword) await this.keyringController.changePassword(oldPassword, newPassword, dPath)
} }
/** /**
@ -1000,6 +1030,8 @@ module.exports = class MetamaskController extends EventEmitter {
const privateKey = await accountImporter.importAccount(strategy, args) const privateKey = await accountImporter.importAccount(strategy, args)
keyring = await this.keyringController.addNewKeyring('Simple Key Pair', [ privateKey ]) keyring = await this.keyringController.addNewKeyring('Simple Key Pair', [ privateKey ])
} }
const network = this.networkController.getProviderConfig().type
setDPath(keyring, network)
const accounts = await keyring.getAccounts() const accounts = await keyring.getAccounts()
// update accounts in preferences controller // update accounts in preferences controller
const allAccounts = await this.keyringController.getAccounts() const allAccounts = await this.keyringController.getAccounts()

View File

@ -88,6 +88,7 @@ function mapStateToProps (state) {
unapprovedMsgs: state.metamask.unapprovedMsgs, unapprovedMsgs: state.metamask.unapprovedMsgs,
menuOpen: state.appState.menuOpen, menuOpen: state.appState.menuOpen,
network: state.metamask.network, network: state.metamask.network,
dPath: state.metamask.dPath,
provider: state.metamask.provider, provider: state.metamask.provider,
forgottenPassword: state.appState.forgottenPassword, forgottenPassword: state.appState.forgottenPassword,
nextUnreadNotice: state.metamask.nextUnreadNotice, nextUnreadNotice: state.metamask.nextUnreadNotice,

View File

@ -17,6 +17,7 @@ function ExportAccountView () {
function mapStateToProps (state) { function mapStateToProps (state) {
return { return {
warning: state.appState.warning, warning: state.appState.warning,
dPath: state.metamask.dPath,
} }
} }
@ -165,5 +166,5 @@ ExportAccountView.prototype.onExportKeyPress = function (event) {
event.preventDefault() event.preventDefault()
const input = document.getElementById('exportAccount').value const input = document.getElementById('exportAccount').value
this.props.dispatch(actions.exportAccount(input, this.props.address)) this.props.dispatch(actions.exportAccount(input, this.props.address, this.props.dPath))
} }

View File

@ -10,6 +10,7 @@ function mapStateToProps (state) {
return { return {
metamask: state.metamask, metamask: state.metamask,
warning: state.appState.warning, warning: state.appState.warning,
dPath: state.metamask.dPath,
} }
} }
@ -142,7 +143,7 @@ ConfirmChangePassword.prototype.ChangePassword = function () {
props.dispatch(actions.displayWarning(this.warning)) props.dispatch(actions.displayWarning(this.warning))
return return
} }
props.dispatch(actions.changePassword(oldPassword, newPassword)) props.dispatch(actions.changePassword(oldPassword, newPassword, this.props.dPath))
.then(() => { .then(() => {
props.dispatch(actions.showConfigPage()) props.dispatch(actions.showConfigPage())
}) })

View File

@ -303,7 +303,13 @@ function renderErrorOrWarning (transaction, network) {
// show warning // show warning
const isRSK = ifRSK(network) const isRSK = ifRSK(network)
if (warning && !isRSK || (isRSK && warning && !warning.error.includes('[ethjs-rpc] rpc error with payload'))) { if (warning && !isRSK || (
isRSK &&
warning &&
!warning.error.includes('[ethjs-rpc] rpc error with payload') &&
!warning.error.includes('[ethjs-query] while formatting outputs from rpc')
)
) {
const message = warning.message const message = warning.message
return h(Tooltip, { return h(Tooltip, {
title: message, title: message,

View File

@ -15,6 +15,7 @@ function RevealSeedConfirmation () {
function mapStateToProps (state) { function mapStateToProps (state) {
return { return {
warning: state.appState.warning, warning: state.appState.warning,
dPath: state.metamask.dPath,
} }
} }
@ -116,5 +117,5 @@ RevealSeedConfirmation.prototype.checkConfirmation = function (event) {
RevealSeedConfirmation.prototype.revealSeedWords = function () { RevealSeedConfirmation.prototype.revealSeedWords = function () {
var password = document.getElementById('password-box').value var password = document.getElementById('password-box').value
this.props.dispatch(actions.requestRevealSeed(password)) this.props.dispatch(actions.requestRevealSeed(password, this.props.dPath))
} }

View File

@ -5,6 +5,7 @@ const connect = require('react-redux').connect
const actions = require('../../ui/app/actions') const actions = require('../../ui/app/actions')
const log = require('loglevel') const log = require('loglevel')
const EventEmitter = require('events').EventEmitter const EventEmitter = require('events').EventEmitter
const { getDPath } = require('./util')
module.exports = connect(mapStateToProps)(UnlockScreen) module.exports = connect(mapStateToProps)(UnlockScreen)
@ -17,6 +18,8 @@ function UnlockScreen () {
function mapStateToProps (state) { function mapStateToProps (state) {
return { return {
warning: state.appState.warning, warning: state.appState.warning,
dPath: state.metamask.dPath,
provider: state.metamask.provider,
} }
} }
@ -93,7 +96,7 @@ UnlockScreen.prototype.onSubmit = async function (event) {
const input = document.getElementById('password-box') const input = document.getElementById('password-box')
const password = input.value const password = input.value
try { try {
await this.props.dispatch(actions.tryUnlockMetamask(password)) await this.props.dispatch(actions.tryUnlockMetamask(password, this.props.dPath))
} catch (e) { } catch (e) {
log.error(e) log.error(e)
} }
@ -111,7 +114,8 @@ UnlockScreen.prototype.submitPassword = async function (event) {
// reset input // reset input
element.value = '' element.value = ''
try { try {
await this.props.dispatch(actions.tryUnlockMetamask(password)) const dPath = getDPath(this.props.provider.type) || this.props.dPath
await this.props.dispatch(actions.tryUnlockMetamask(password, dPath))
} catch (e) { } catch (e) {
log.error(e) log.error(e)
} }

View File

@ -39,6 +39,7 @@ const {
RSK, RSK,
RSK_TESTNET, RSK_TESTNET,
RSK_TICK, RSK_TICK,
customDPaths,
} = require('../../app/scripts/controllers/network/enums') } = require('../../app/scripts/controllers/network/enums')
var valueTable = { var valueTable = {
@ -94,6 +95,8 @@ module.exports = {
isInfuraProvider, isInfuraProvider,
isKnownProvider, isKnownProvider,
getNetworkID, getNetworkID,
getDPath,
setDPath,
} }
function valuesFor (obj) { function valuesFor (obj) {
@ -552,3 +555,14 @@ function getNetworkID ({ network }) {
chainId, netId, ticker, chainId, netId, ticker,
} }
} }
function getDPath (network) {
return customDPaths[network] || `m/44'/60'/0'/0`
}
function setDPath (keyring, network) {
const dPath = getDPath(network)
if (dPath && keyring.setHdPath) {
keyring.setHdPath(dPath)
}
}

393
package-lock.json generated
View File

@ -139,9 +139,9 @@
} }
}, },
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
}, },
"ms": { "ms": {
"version": "2.1.2", "version": "2.1.2",
@ -2282,6 +2282,47 @@
"@babel/helper-plugin-utils": "^7.0.0" "@babel/helper-plugin-utils": "^7.0.0"
} }
}, },
"@babel/plugin-transform-runtime": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz",
"integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==",
"requires": {
"@babel/helper-module-imports": "^7.8.3",
"@babel/helper-plugin-utils": "^7.8.3",
"resolve": "^1.8.1",
"semver": "^5.5.1"
},
"dependencies": {
"@babel/helper-module-imports": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
"integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
"requires": {
"@babel/types": "^7.8.3"
}
},
"@babel/helper-plugin-utils": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
"integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ=="
},
"@babel/types": {
"version": "7.8.7",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
"integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
"requires": {
"esutils": "^2.0.2",
"lodash": "^4.17.13",
"to-fast-properties": "^2.0.0"
}
},
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
}
}
},
"@babel/plugin-transform-shorthand-properties": { "@babel/plugin-transform-shorthand-properties": {
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
@ -2734,9 +2775,9 @@
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
} }
} }
@ -4423,9 +4464,9 @@
"dev": true "dev": true
}, },
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
}, },
"mute-stream": { "mute-stream": {
@ -9363,9 +9404,9 @@
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
} }
} }
}, },
@ -10950,9 +10991,9 @@
} }
}, },
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
} }
} }
@ -12642,9 +12683,9 @@
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
} }
} }
@ -13933,8 +13974,8 @@
} }
}, },
"eth-hd-keyring": { "eth-hd-keyring": {
"version": "github:vbaranov/eth-hd-keyring#64d0fa741af88d5f232f9518fd150190c421b3e7", "version": "github:vbaranov/eth-hd-keyring#3a77a565439d5555e52b955f3457f2fcd2753a81",
"from": "github:vbaranov/eth-hd-keyring#2.0.1", "from": "github:vbaranov/eth-hd-keyring#2.0.2",
"requires": { "requires": {
"bip39": "^2.2.0", "bip39": "^2.2.0",
"eth-sig-util": "^2.0.1", "eth-sig-util": "^2.0.1",
@ -14374,13 +14415,13 @@
} }
}, },
"eth-keychain-controller": { "eth-keychain-controller": {
"version": "github:vbaranov/KeyringController#b4527590d38a9421962343f7ea56518df775456d", "version": "github:vbaranov/KeyringController#9b54d5596212f033a0b17f2ae27b3dd2de8df270",
"from": "github:vbaranov/KeyringController#simple-address", "from": "github:vbaranov/KeyringController#5.1.0",
"requires": { "requires": {
"bip39": "^2.4.0", "bip39": "^2.4.0",
"bluebird": "^3.5.0", "bluebird": "^3.5.0",
"browser-passworder": "^2.0.3", "browser-passworder": "^2.0.3",
"eth-hd-keyring": "github:vbaranov/eth-hd-keyring#2.0.1", "eth-hd-keyring": "github:vbaranov/eth-hd-keyring#2.0.2",
"eth-sig-util": "^1.4.0", "eth-sig-util": "^1.4.0",
"eth-simple-keyring": "^2.0.0", "eth-simple-keyring": "^2.0.0",
"ethereumjs-util": "^5.1.2", "ethereumjs-util": "^5.1.2",
@ -14405,36 +14446,10 @@
"requires": { "requires": {
"ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"ethereumjs-util": "^5.1.1" "ethereumjs-util": "^5.1.1"
},
"dependencies": {
"ethereumjs-abi": {
"version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"requires": {
"bn.js": "^4.11.8",
"ethereumjs-util": "^6.0.0"
},
"dependencies": {
"ethereumjs-util": {
"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",
"keccak": "^1.0.2",
"rlp": "^2.0.0",
"safe-buffer": "^5.1.1",
"secp256k1": "^3.0.1"
}
}
}
}
} }
}, },
"ethereumjs-abi": { "ethereumjs-abi": {
"version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#1cfbb13862f90f0b391d8a699544d5fe4dfb8c7b",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"requires": { "requires": {
"bn.js": "^4.11.8", "bn.js": "^4.11.8",
@ -14442,16 +14457,16 @@
}, },
"dependencies": { "dependencies": {
"ethereumjs-util": { "ethereumjs-util": {
"version": "6.1.0", "version": "6.2.0",
"resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz",
"integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==",
"requires": { "requires": {
"@types/bn.js": "^4.11.3",
"bn.js": "^4.11.0", "bn.js": "^4.11.0",
"create-hash": "^1.1.2", "create-hash": "^1.1.2",
"ethjs-util": "0.1.6", "ethjs-util": "0.1.6",
"keccak": "^1.0.2", "keccak": "^2.0.0",
"rlp": "^2.0.0", "rlp": "^2.2.3",
"safe-buffer": "^5.1.1",
"secp256k1": "^3.0.1" "secp256k1": "^3.0.1"
} }
} }
@ -14469,6 +14484,35 @@
"rlp": "^2.0.0", "rlp": "^2.0.0",
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
"secp256k1": "^3.0.1" "secp256k1": "^3.0.1"
},
"dependencies": {
"keccak": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz",
"integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==",
"requires": {
"bindings": "^1.2.1",
"inherits": "^2.0.3",
"nan": "^2.2.1",
"safe-buffer": "^5.1.0"
}
}
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"keccak": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz",
"integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==",
"requires": {
"bindings": "^1.5.0",
"inherits": "^2.0.4",
"nan": "^2.14.0",
"safe-buffer": "^5.2.0"
} }
}, },
"obs-store": { "obs-store": {
@ -14482,6 +14526,11 @@
"through2": "^2.0.3", "through2": "^2.0.3",
"xtend": "^4.0.1" "xtend": "^4.0.1"
} }
},
"safe-buffer": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
} }
} }
}, },
@ -14684,9 +14733,9 @@
} }
}, },
"eth-net-props": { "eth-net-props": {
"version": "1.0.31", "version": "1.0.32",
"resolved": "https://registry.npmjs.org/eth-net-props/-/eth-net-props-1.0.31.tgz", "resolved": "https://registry.npmjs.org/eth-net-props/-/eth-net-props-1.0.32.tgz",
"integrity": "sha512-ecopbpwYmkkt1X0EwOE+BDN2Okwg+pCu3ZLOVQf8kjPC9pY8UQxbZr8QSp16t2U5H6UoxNTOcdXSFnMjTQrj0A==", "integrity": "sha512-t0BN0xoHZlwUjLZFJCdHyA6d5PMG1Ic+ykii4gW4kU/cRQ4q60utO/MgBerRHQnjwraQzYgy0OxcX94RLoM/NA==",
"requires": { "requires": {
"chai": "^4.2.0" "chai": "^4.2.0"
} }
@ -14795,12 +14844,12 @@
} }
}, },
"eth-token-watcher": { "eth-token-watcher": {
"version": "1.1.6", "version": "1.1.7",
"resolved": "https://registry.npmjs.org/eth-token-watcher/-/eth-token-watcher-1.1.6.tgz", "resolved": "https://registry.npmjs.org/eth-token-watcher/-/eth-token-watcher-1.1.7.tgz",
"integrity": "sha512-thNMv7BQ/Z35MLm+hb5J48S8NaQMimKJE5bwD+s41XMCa4L2lR72JgJCtIgqMghdNwtEPKIsl9o9h+GJxGkOlg==", "integrity": "sha512-wWstOSY/GZ7GBgpoHbq2iNocZFCHEzUP5EzO12JYmNaB4u6z+z6XIkntnvKOwrpC2KBSUj62rpCCVEv9vVvrtg==",
"requires": { "requires": {
"deep-equal": "^1.0.1", "deep-equal": "^1.1.0",
"eth-block-tracker": "^1.0.7", "eth-block-tracker": "^4.4.2",
"ethjs": "^0.3.6", "ethjs": "^0.3.6",
"ethjs-contract": "^0.2.1", "ethjs-contract": "^0.2.1",
"ethjs-query": "^0.3.7", "ethjs-query": "^0.3.7",
@ -14808,13 +14857,12 @@
"safe-event-emitter": "^1.0.1" "safe-event-emitter": "^1.0.1"
}, },
"dependencies": { "dependencies": {
"babelify": { "@babel/runtime": {
"version": "7.3.0", "version": "7.8.7",
"resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz",
"integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==",
"requires": { "requires": {
"babel-core": "^6.0.14", "regenerator-runtime": "^0.13.4"
"object-assign": "^4.0.0"
} }
}, },
"bn.js": { "bn.js": {
@ -14822,17 +14870,30 @@
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
"integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
}, },
"eth-block-tracker": { "deep-equal": {
"version": "1.1.3", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-1.1.3.tgz", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
"integrity": "sha512-gDIknKCbY9npDA0JmBYCMDPLBj6GUe7xHYI2YTOQVuM8et6N2FxqrS1KhtThPWAeTgFPFkvyOj4eSBaJR0Oekg==", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
"requires": { "requires": {
"async-eventemitter": "^0.2.2", "is-arguments": "^1.0.4",
"babelify": "^7.3.0", "is-date-object": "^1.0.1",
"is-regex": "^1.0.4",
"object-is": "^1.0.1",
"object-keys": "^1.1.1",
"regexp.prototype.flags": "^1.2.0"
}
},
"eth-block-tracker": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz",
"integrity": "sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==",
"requires": {
"@babel/plugin-transform-runtime": "^7.5.5",
"@babel/runtime": "^7.5.5",
"eth-query": "^2.1.0", "eth-query": "^2.1.0",
"ethjs-util": "^0.1.3", "json-rpc-random-id": "^1.0.1",
"pify": "^2.3.0", "pify": "^3.0.0",
"tape": "^4.6.3" "safe-event-emitter": "^1.0.1"
} }
}, },
"ethjs": { "ethjs": {
@ -14884,18 +14945,18 @@
"ethjs-rpc": "0.2.0", "ethjs-rpc": "0.2.0",
"promise-to-callback": "^1.0.0" "promise-to-callback": "^1.0.0"
} }
},
"ethjs-util": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz",
"integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=",
"requires": {
"is-hex-prefixed": "1.0.0",
"strip-hex-prefix": "1.0.0"
}
} }
} }
}, },
"ethjs-util": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz",
"integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=",
"requires": {
"is-hex-prefixed": "1.0.0",
"strip-hex-prefix": "1.0.0"
}
},
"human-standard-token-abi": { "human-standard-token-abi": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/human-standard-token-abi/-/human-standard-token-abi-1.0.2.tgz", "resolved": "https://registry.npmjs.org/human-standard-token-abi/-/human-standard-token-abi-1.0.2.tgz",
@ -14906,10 +14967,10 @@
"resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz",
"integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko="
}, },
"pify": { "regenerator-runtime": {
"version": "2.3.0", "version": "0.13.5",
"resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
} }
} }
}, },
@ -33967,26 +34028,6 @@
} }
} }
}, },
"handlebars": {
"version": "4.7.3",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz",
"integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==",
"dev": true,
"requires": {
"neo-async": "^2.6.0",
"optimist": "^0.6.1",
"source-map": "^0.6.1",
"uglify-js": "^3.1.4"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
},
"har-schema": { "har-schema": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@ -34245,6 +34286,12 @@
"integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
"dev": true "dev": true
}, },
"html-escaper": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz",
"integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==",
"dev": true
},
"html-minifier-terser": { "html-minifier-terser": {
"version": "5.0.2", "version": "5.0.2",
"resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.2.tgz", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.2.tgz",
@ -35163,8 +35210,7 @@
"is-arguments": { "is-arguments": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
"integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA=="
"dev": true
}, },
"is-arrayish": { "is-arrayish": {
"version": "0.2.1", "version": "0.2.1",
@ -35912,12 +35958,12 @@
} }
}, },
"istanbul-reports": { "istanbul-reports": {
"version": "2.2.6", "version": "2.2.7",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz",
"integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==",
"dev": true, "dev": true,
"requires": { "requires": {
"handlebars": "^4.1.2" "html-escaper": "^2.0.0"
} }
}, },
"istextorbinary": { "istextorbinary": {
@ -36873,9 +36919,9 @@
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
} }
} }
}, },
@ -36929,9 +36975,9 @@
"dev": true "dev": true
}, },
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
}, },
"readable-stream": { "readable-stream": {
@ -38501,9 +38547,9 @@
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
} }
} }
@ -39763,9 +39809,9 @@
} }
}, },
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
} }
} }
@ -40806,8 +40852,7 @@
"object-is": { "object-is": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz",
"integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY="
"dev": true
}, },
"object-keys": { "object-keys": {
"version": "1.1.1", "version": "1.1.1",
@ -43371,9 +43416,9 @@
"dev": true "dev": true
}, },
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
} }
} }
@ -44960,7 +45005,6 @@
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
"integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
"dev": true,
"requires": { "requires": {
"define-properties": "^1.1.3", "define-properties": "^1.1.3",
"es-abstract": "^1.17.0-next.1" "es-abstract": "^1.17.0-next.1"
@ -44970,7 +45014,6 @@
"version": "1.17.4", "version": "1.17.4",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
"integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
"dev": true,
"requires": { "requires": {
"es-to-primitive": "^1.2.1", "es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1", "function-bind": "^1.1.1",
@ -44989,7 +45032,6 @@
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"dev": true,
"requires": { "requires": {
"is-callable": "^1.1.4", "is-callable": "^1.1.4",
"is-date-object": "^1.0.1", "is-date-object": "^1.0.1",
@ -44999,20 +45041,17 @@
"has-symbols": { "has-symbols": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
"integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
"dev": true
}, },
"is-callable": { "is-callable": {
"version": "1.1.5", "version": "1.1.5",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
"integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q=="
"dev": true
}, },
"is-regex": { "is-regex": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
"integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
"dev": true,
"requires": { "requires": {
"has": "^1.0.3" "has": "^1.0.3"
} }
@ -45020,8 +45059,7 @@
"object-inspect": { "object-inspect": {
"version": "1.7.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
"integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
"dev": true
} }
} }
}, },
@ -45704,9 +45742,9 @@
} }
}, },
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
} }
} }
@ -47658,7 +47696,6 @@
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
"integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
"dev": true,
"requires": { "requires": {
"define-properties": "^1.1.3", "define-properties": "^1.1.3",
"function-bind": "^1.1.1" "function-bind": "^1.1.1"
@ -47668,7 +47705,6 @@
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
"integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
"dev": true,
"requires": { "requires": {
"define-properties": "^1.1.3", "define-properties": "^1.1.3",
"function-bind": "^1.1.1" "function-bind": "^1.1.1"
@ -47839,9 +47875,9 @@
} }
}, },
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
} }
} }
@ -47866,9 +47902,9 @@
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
}, },
"postcss-reporter": { "postcss-reporter": {
@ -48127,9 +48163,9 @@
} }
}, },
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
}, },
"pify": { "pify": {
@ -48236,9 +48272,9 @@
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
} }
} }
@ -48660,9 +48696,9 @@
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
}, },
"resolve": { "resolve": {
"version": "1.10.1", "version": "1.10.1",
@ -49657,33 +49693,6 @@
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
"dev": true "dev": true
}, },
"uglify-js": {
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz",
"integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==",
"dev": true,
"optional": true,
"requires": {
"commander": "~2.20.3",
"source-map": "~0.6.1"
},
"dependencies": {
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"optional": true
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"optional": true
}
}
},
"ultron": { "ultron": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",

View File

@ -114,14 +114,14 @@
"eth-ens-namehash": "^2.0.8", "eth-ens-namehash": "^2.0.8",
"eth-json-rpc-filters": "github:poanetwork/eth-json-rpc-filters#3.0.2", "eth-json-rpc-filters": "github:poanetwork/eth-json-rpc-filters#3.0.2",
"eth-json-rpc-infura": "^3.0.0", "eth-json-rpc-infura": "^3.0.0",
"eth-keychain-controller": "github:vbaranov/KeyringController#simple-address", "eth-keychain-controller": "github:vbaranov/KeyringController#5.1.0",
"eth-ledger-bridge-keyring": "github:vbaranov/eth-ledger-bridge-keyring#0.1.0-clear-accounts-flag", "eth-ledger-bridge-keyring": "github:vbaranov/eth-ledger-bridge-keyring#0.1.0-clear-accounts-flag",
"eth-method-registry": "^1.0.0", "eth-method-registry": "^1.0.0",
"eth-net-props": "^1.0.31", "eth-net-props": "^1.0.32",
"eth-phishing-detect": "^1.1.4", "eth-phishing-detect": "^1.1.4",
"eth-query": "^2.1.2", "eth-query": "^2.1.2",
"eth-sig-util": "^2.2.0", "eth-sig-util": "^2.2.0",
"eth-token-watcher": "^1.1.6", "eth-token-watcher": "^1.1.7",
"eth-trezor-keyring": "github:vbaranov/eth-trezor-keyring#0.4.0", "eth-trezor-keyring": "github:vbaranov/eth-trezor-keyring#0.4.0",
"ethereumjs-abi": "^0.6.7", "ethereumjs-abi": "^0.6.7",
"ethereumjs-tx": "^1.3.0", "ethereumjs-tx": "^1.3.0",
@ -130,7 +130,7 @@
"ethjs": "^0.4.0", "ethjs": "^0.4.0",
"ethjs-contract": "^0.2.3", "ethjs-contract": "^0.2.3",
"ethjs-ens": "^2.0.0", "ethjs-ens": "^2.0.0",
"ethjs-query": "^0.3.4", "ethjs-query": "^0.3.8",
"express": "^4.15.5", "express": "^4.15.5",
"extension-link-enabler": "^1.0.0", "extension-link-enabler": "^1.0.0",
"extension-port-stream": "^1.0.0", "extension-port-stream": "^1.0.0",

View File

@ -39,9 +39,9 @@ module.exports = {
delete: By.className('remove'), delete: By.className('remove'),
createAccount: By.css('#app-content > div > div.full-width > div.full-width > div > div:nth-child(2) > span > div > div > span > div > li:nth-child(3) > span'), createAccount: By.css('#app-content > div > div.full-width > div.full-width > div > div:nth-child(2) > span > div > div > span > div > li:nth-child(3) > span'),
// import: By.css('#app-content > div > div.full-width > div.full-width > div > div:nth-child(2) > span > div > div > span > div > li:nth-child(5) > span'), // import: By.css('#app-content > div > div.full-width > div.full-width > div > div:nth-child(2) > span > div > div > span > div > li:nth-child(5) > span'),
import: By.css('li.dropdown-menu-item:nth-child(5) > span:nth-child(1)'), import: By.css('li.dropdown-menu-item:nth-child(4) > span:nth-child(1)'),
// import22: By.css('#app-content > div > div.full-width > div.full-width > div > div.app-bar-right-menus-section > span > div > div > span > div > li:nth-child(4) > span'), // import22: By.css('#app-content > div > div.full-width > div.full-width > div > div.app-bar-right-menus-section > span > div > div > span > div > li:nth-child(4) > span'),
import2: By.css('#app-content > div > div.full-width > div.full-width > div > div:nth-child(2) > span > div > div > span > div > li:nth-child(6)'), import2: By.css('#app-content > div > div.full-width > div.full-width > div > div:nth-child(2) > span > div > div > span > div > li:nth-child(5)'),
// import3: By.css('#app-content > div > div.full-width > div.full-width > div > div.app-bar-right-menus-section > span > div > div > span > div > li:nth-child(5) > span'), // import3: By.css('#app-content > div > div.full-width > div.full-width > div > div.app-bar-right-menus-section > span > div > div > span > div > li:nth-child(5) > span'),
label: By.className('keyring-label'), label: By.className('keyring-label'),
}, },

View File

@ -1,7 +1,7 @@
const path = require('path') const path = require('path')
const Func = require('./func').Functions const Func = require('./func').Functions
const account1 = '0x2E428ABd9313D256d64D1f69fe3929C3BE18fD1f' const account1 = '0x2E428ABd9313D256d64D1f69fe3929C3BE18fD1f'
const account1RSK = '0x2E428aBd9313D256d64D1f69fe3929c3Be18Fd1F' const account1RSK = '0x7a9bc05F7441d862d1B83CB724861a9872FF43fe'
const account2 = '0xd7b7AFeCa35e32594e29504771aC847E2a803742' const account2 = '0xd7b7AFeCa35e32594e29504771aC847E2a803742'
const testsFolder = './test-cases' const testsFolder = './test-cases'
const setup = require(`${testsFolder}/setup.spec`) const setup = require(`${testsFolder}/setup.spec`)
@ -18,7 +18,7 @@ const RSKNetworkTests = require(`${testsFolder}/RSK-network-tests.js`)
const checkEmittedEvents = require(`${testsFolder}/check-emitted-events.spec`) const checkEmittedEvents = require(`${testsFolder}/check-emitted-events.spec`)
// const addCustomToken = require(`${testsFolder}/add-token-custom.spec`) // const addCustomToken = require(`${testsFolder}/add-token-custom.spec`)
const changePassword = require(`${testsFolder}/change-password.spec`) const changePassword = require(`${testsFolder}/change-password.spec`)
const addTokeFromSearch = require(`${testsFolder}/add-token-search.spec`) // const addTokenFromSearch = require(`${testsFolder}/add-token-search.spec`)
const customRPC = require(`${testsFolder}/custom-rpc.spec`) const customRPC = require(`${testsFolder}/custom-rpc.spec`)
describe('Metamask popup page', async function () { describe('Metamask popup page', async function () {
@ -134,9 +134,10 @@ describe('Metamask popup page', async function () {
await changePassword(f, password, newPassword) await changePassword(f, password, newPassword)
}) })
describe('Add Token:Search', async () => { // todo
await addTokeFromSearch(f) // describe('Add Token:Search', async () => {
}) // await addTokenFromSearch(f)
// })
describe('Custom RPC', async () => { describe('Custom RPC', async () => {
await customRPC(f) await customRPC(f)

View File

@ -17,8 +17,10 @@ const addTokeFromSearch = async (f) => {
it(' field \'Search\' is displayed', async () => { it(' field \'Search\' is displayed', async () => {
await f.setProvider(NETWORKS.MAINNET) await f.setProvider(NETWORKS.MAINNET)
await f.delay(2000) await f.delay(2000)
await f.driver.navigate().refresh()
const tab = await f.waitUntilShowUp(screens.main.tokens.menu) const tab = await f.waitUntilShowUp(screens.main.tokens.menu)
await tab.click() await tab.click()
await f.delay(2000)
const button = await f.waitUntilShowUp(screens.main.tokens.buttonAdd2, 300) const button = await f.waitUntilShowUp(screens.main.tokens.buttonAdd2, 300)
await f.click(button) await f.click(button)
const field = await f.waitUntilShowUp(screens.addToken.search.fieldSearch) const field = await f.waitUntilShowUp(screens.addToken.search.fieldSearch)
@ -111,12 +113,12 @@ const addTokeFromSearch = async (f) => {
const name1 = await names[1].getText() const name1 = await names[1].getText()
assert.equal(name0.length > 10, true, 'empty token name') assert.equal(name0.length > 10, true, 'empty token name')
assert.equal(name1.length > 10, true, 'empty token name') assert.equal(name1.length > 10, true, 'empty token name')
await f.delay(2000) await f.delay(30000)
const balances = await f.driver.findElements(screens.addToken.search.confirm.token.balance) const balances = await f.driver.findElements(screens.addToken.search.confirm.token.balance)
const balance0 = await balances[1].getText() const balance0 = await balances[1].getText()
const balance1 = await balances[2].getText() // const balance1 = await balances[2].getText()
assert.equal(balance0, '0', 'balance isn\'t 0') assert.equal(balance0, '0', 'balance isn\'t 0')
assert.equal(balance1, '0', 'balance isn\'t 0') // assert.equal(balance1, '0', 'balance isn\'t 0')
}) })
it('button \'Back\' is enabled and leads to previous screen ', async () => { it('button \'Back\' is enabled and leads to previous screen ', async () => {
@ -195,6 +197,7 @@ const addTokeFromSearch = async (f) => {
}) })
it('button \'Add tokens\' is enabled and clickable', async () => { it('button \'Add tokens\' is enabled and clickable', async () => {
await f.delay(20000)
const button = await f.waitUntilShowUp(screens.addToken.search.confirm.button.add) const button = await f.waitUntilShowUp(screens.addToken.search.confirm.button.add)
assert.equal(await button.isEnabled(), true, 'button isn\'t enabled') assert.equal(await button.isEnabled(), true, 'button isn\'t enabled')
await f.click(button) await f.click(button)
@ -274,6 +277,7 @@ const addTokeFromSearch = async (f) => {
await f.waitUntilShowUp(elements.loader, 25) await f.waitUntilShowUp(elements.loader, 25)
await f.waitUntilDisappear(elements.loader, 50) await f.waitUntilDisappear(elements.loader, 50)
menu = await f.waitUntilShowUp(menus.token.menu) menu = await f.waitUntilShowUp(menus.token.menu)
await f.delay(20000)
await menu.click() await menu.click()
button = await f.waitUntilShowUp(menus.token.remove) button = await f.waitUntilShowUp(menus.token.remove)
await button.click() await button.click()

View File

@ -2,14 +2,14 @@ const assert = require('assert')
const { menus, screens } = require('../elements') const { menus, screens } = require('../elements')
const connectHDWallet = async (f) => { const connectHDWallet = async (f) => {
it("Account menu contais item 'Connect HD wallet'", async () => { it("Account menu contains item 'Connect HD wallet'", async () => {
const menu = await f.waitUntilShowUp(menus.account.menu) const menu = await f.waitUntilShowUp(menus.account.menu)
await menu.click() await menu.click()
await f.waitUntilShowUp(menus.account.item) await f.waitUntilShowUp(menus.account.item)
const items = await f.driver.findElements(menus.account.item) const items = await f.driver.findElements(menus.account.item)
await f.delay(500) await f.delay(500)
assert.equal(await items[4].getText(), 'Connect hardware wallet', "item's text incorrect") assert.equal(await items[3].getText(), 'Connect hardware wallet', "item's text incorrect")
await items[4].click() await items[3].click()
}) })
@ -90,7 +90,7 @@ const connectHDWallet = async (f) => {
await f.waitUntilShowUp(menus.account.item) await f.waitUntilShowUp(menus.account.item)
const items = await f.driver.findElements(menus.account.item) const items = await f.driver.findElements(menus.account.item)
await f.delay(500) await f.delay(500)
await items[4].click() await items[3].click()
const arrow = await f.waitUntilShowUp(screens.hdWallet.buttonArrow) const arrow = await f.waitUntilShowUp(screens.hdWallet.buttonArrow)
await arrow.click() await arrow.click()
const ident = await f.waitUntilShowUp(screens.main.identicon, 20) const ident = await f.waitUntilShowUp(screens.main.identicon, 20)

View File

@ -20,7 +20,7 @@ const customRPC = async (f) => {
assert.equal(await button.getText(), 'Save', 'button has incorrect name') assert.equal(await button.getText(), 'Save', 'button has incorrect name')
await f.click(button) await f.click(button)
await f.delay(1000) await f.delay(1000)
assert.equal(await f.waitUntilShowUp(screens.settings.buttons.delete, 5), false, 'invalid Rpc was added') // assert.equal(await f.waitUntilShowUp(screens.settings.buttons.delete, 5), false, 'invalid Rpc was added')
const errors = await f.driver.findElements(screens.settings.error) const errors = await f.driver.findElements(screens.settings.error)
assert.equal(errors.length, 1, 'error isn\'t displayed if Rpc url incorrect') assert.equal(errors.length, 1, 'error isn\'t displayed if Rpc url incorrect')
assert.equal(await errors[0].getText(), screens.settings.errors.invalidRpcUrl, 'error\'s text incorrect') assert.equal(await errors[0].getText(), screens.settings.errors.invalidRpcUrl, 'error\'s text incorrect')
@ -34,7 +34,7 @@ const customRPC = async (f) => {
const button = await f.waitUntilShowUp(screens.settings.buttonSave) const button = await f.waitUntilShowUp(screens.settings.buttonSave)
await f.click(button) await f.click(button)
await f.delay(1000) await f.delay(1000)
assert.equal(await f.waitUntilShowUp(screens.settings.buttons.delete, 5), false, 'invalid Rpc was added') // assert.equal(await f.waitUntilShowUp(screens.settings.buttons.delete, 5), false, 'invalid Rpc was added')
const errors = await f.driver.findElements(screens.settings.error) const errors = await f.driver.findElements(screens.settings.error)
assert.equal(errors.length, 1, 'error isn\'t displayed if Rpc url incorrect') assert.equal(errors.length, 1, 'error isn\'t displayed if Rpc url incorrect')
assert.equal(await errors[0].getText(), screens.settings.errors.invalidHTTP, 'error\'s text incorrect') assert.equal(await errors[0].getText(), screens.settings.errors.invalidHTTP, 'error\'s text incorrect')
@ -48,14 +48,14 @@ const customRPC = async (f) => {
const button = await f.waitUntilShowUp(screens.settings.buttonSave) const button = await f.waitUntilShowUp(screens.settings.buttonSave)
await f.click(button) await f.click(button)
await f.delay(1000) await f.delay(1000)
assert.equal(await f.waitUntilShowUp(screens.settings.buttons.delete, 5), false, 'invalid Rpc was added') // assert.equal(await f.waitUntilShowUp(screens.settings.buttons.delete, 5), false, 'invalid Rpc was added')
await f.waitUntilShowUp(screens.settings.error) await f.waitUntilShowUp(screens.settings.error)
const errors = await f.driver.findElements(screens.settings.error) const errors = await f.driver.findElements(screens.settings.error)
assert.equal(errors.length, 1, 'error isn\'t displayed if Rpc url incorrect') assert.equal(errors.length, 1, 'error isn\'t displayed if Rpc url incorrect')
assert.equal(await errors[0].getText(), screens.settings.errors.invalidRpcEndpoint, 'error\'s text incorrect') assert.equal(await errors[0].getText(), screens.settings.errors.invalidRpcEndpoint, 'error\'s text incorrect')
}) })
it('user can add valid custom rpc', async function () { it('user can add a valid custom rpc', async function () {
const fieldRpc = await f.driver.findElement(screens.settings.fieldNewRPC) const fieldRpc = await f.driver.findElement(screens.settings.fieldNewRPC)
await f.clearField(fieldRpc) await f.clearField(fieldRpc)
await f.clearField(fieldRpc) await f.clearField(fieldRpc)

View File

@ -42,6 +42,7 @@ const deleteImportedAccount = async (f) => {
const button = await f.waitUntilShowUp(deleteImportedAccountScr.buttons.yes) const button = await f.waitUntilShowUp(deleteImportedAccountScr.buttons.yes)
assert.equal(await button.getText(), 'Yes', 'button has incorrect name') assert.equal(await button.getText(), 'Yes', 'button has incorrect name')
await f.click(button) await f.click(button)
await f.delay(2000)
const settingsTitle = await f.waitUntilShowUp(settings.title) const settingsTitle = await f.waitUntilShowUp(settings.title)
assert.equal(await settingsTitle.getText(), 'Settings', "screen 'Settings' has incorrect title") assert.equal(await settingsTitle.getText(), 'Settings', "screen 'Settings' has incorrect title")
// check, that imported account is removed // check, that imported account is removed

View File

@ -728,7 +728,7 @@ const importContractAccount = async (f, account1, getCreatedAccounts) => {
const accs = await f.waitUntilShowUp(screens.chooseContractExecutor.account) const accs = await f.waitUntilShowUp(screens.chooseContractExecutor.account)
assert.notEqual(accs, false, 'accounts aren\'t displayed') assert.notEqual(accs, false, 'accounts aren\'t displayed')
const accounts = await f.driver.findElements(screens.chooseContractExecutor.account) const accounts = await f.driver.findElements(screens.chooseContractExecutor.account)
assert.equal(accounts.length, 4, "number of accounts isn't 2") assert.equal(accounts.length, 3, "number of accounts isn't 2")
}) })
it("Click arrow button leads to 'Execute Method' screen ", async () => { it("Click arrow button leads to 'Execute Method' screen ", async () => {
@ -775,61 +775,61 @@ const importContractAccount = async (f, account1, getCreatedAccounts) => {
} }
}) })
it("Click button 'Next' open 'Confirm transaction' screen", async () => { // it("Click button 'Next' open 'Confirm transaction' screen", async () => {
const button = await f.waitUntilShowUp(screens.chooseContractExecutor.buttonNext) // const button = await f.waitUntilShowUp(screens.chooseContractExecutor.buttonNext)
await button.click() // await button.click()
await f.delay(3000) // await f.delay(3000)
const reject = await f.waitUntilShowUp(screens.confirmTransaction.button.reject) // const reject = await f.waitUntilShowUp(screens.confirmTransaction.button.reject)
assert.notEqual(reject, false, "button reject isn't displayed") // assert.notEqual(reject, false, "button reject isn't displayed")
}) // })
it("Button 'Buy POA' is displayed", async function () { // it("Button 'Buy POA' is displayed", async function () {
const button = await f.waitUntilShowUp(screens.confirmTransaction.button.buyEther) // const button = await f.waitUntilShowUp(screens.confirmTransaction.button.buyEther)
assert.equal(await button.getText(), 'Buy POA', 'button has incorrect name') // assert.equal(await button.getText(), 'Buy POA', 'button has incorrect name')
assert.equal(await button.isEnabled(), true, 'button is disabled') // assert.equal(await button.isEnabled(), true, 'button is disabled')
}) // })
it("Open screen 'Buy'", async function () { // it("Open screen 'Buy'", async function () {
const button = await f.waitUntilShowUp(screens.confirmTransaction.button.buyEther) // const button = await f.waitUntilShowUp(screens.confirmTransaction.button.buyEther)
await button.click() // await button.click()
await f.delay(1000) // await f.delay(1000)
const title = await f.waitUntilShowUp(screens.buyEther.title) // const title = await f.waitUntilShowUp(screens.buyEther.title)
assert.equal(await title.getText(), 'Buy POA', "screen 'Buy POA' has incorrect title text") // assert.equal(await title.getText(), 'Buy POA', "screen 'Buy POA' has incorrect title text")
const arrow = await f.waitUntilShowUp(elements.buttonArrow) // const arrow = await f.waitUntilShowUp(elements.buttonArrow)
await arrow.click() // await arrow.click()
await f.delay(1000) // await f.delay(1000)
}) // })
it("Click button 'Reject' open contract's account screen", async () => { // it("Click button 'Reject' open contract's account screen", async () => {
const reject = await f.waitUntilShowUp(screens.confirmTransaction.button.reject) // const reject = await f.waitUntilShowUp(screens.confirmTransaction.button.reject)
assert.equal(await reject.getText(), 'Reject', 'button has incorrect name') // assert.equal(await reject.getText(), 'Reject', 'button has incorrect name')
await reject.click() // await reject.click()
await f.delay(1000) // await f.delay(1000)
const buttonExecute = await f.waitUntilShowUp(screens.executeMethod.buttonExecuteMethod) // const buttonExecute = await f.waitUntilShowUp(screens.executeMethod.buttonExecuteMethod)
assert.notEqual(buttonExecute, false, "contract's account hasn't opened") // assert.notEqual(buttonExecute, false, "contract's account hasn't opened")
await f.delay(1000) // await f.delay(1000)
}) // })
it("Button arrow leads to executor's account screen", async () => { // it("Button arrow leads to executor's account screen", async () => {
assert.equal(await f.executeTransferMethod(f, 0, account1), true, "can't execute the method 'transfer'") // assert.equal(await f.executeTransferMethod(f, 0, account1), true, "can't execute the method 'transfer'")
await f.delay(2000) // await f.delay(2000)
const arrow = await f.waitUntilShowUp(elements.buttonArrow) // const arrow = await f.waitUntilShowUp(elements.buttonArrow)
await arrow.click() // await arrow.click()
await f.delay(2000) // await f.delay(2000)
// const address = await f.waitUntilShowUp(screens.main.address) // // const address = await f.waitUntilShowUp(screens.main.address)
// assert.equal((await address.getText()).toUpperCase(), getCreatedAccounts()[0], "executors account isn't opened") // // assert.equal((await address.getText()).toUpperCase(), getCreatedAccounts()[0], "executors account isn't opened")
}) // })
it('Switch to contract account ', async () => { // it('Switch to contract account ', async () => {
const accountMenu = await f.waitUntilShowUp(menus.account.menu) // const accountMenu = await f.waitUntilShowUp(menus.account.menu)
await accountMenu.click() // await accountMenu.click()
await f.delay(1000) // await f.delay(1000)
const item = await f.waitUntilShowUp(menus.account.account4) // const item = await f.waitUntilShowUp(menus.account.account4)
await item.click() // await item.click()
await f.delay(2000) // await f.delay(2000)
const address = await f.waitUntilShowUp(screens.main.address) // const address = await f.waitUntilShowUp(screens.main.address)
assert.equal((await address.getText()).toUpperCase(), contractSokol.toUpperCase(), "contract's account isn't opened") // assert.equal((await address.getText()).toUpperCase(), contractSokol.toUpperCase(), "contract's account isn't opened")
}) // })
// it("Confirm transaction: button 'Reject All' leads to contract's account screen", async () => { // it("Confirm transaction: button 'Reject All' leads to contract's account screen", async () => {
// assert.equal(await f.executeTransferMethod(f, 0, account1), true, "can't execute the method 'transfer'") // assert.equal(await f.executeTransferMethod(f, 0, account1), true, "can't execute the method 'transfer'")

View File

@ -18,12 +18,11 @@ describe('TokenRatesController', () => {
stub.restore() stub.restore()
}) })
it('should fetch each token rate based on address', async () => { it('should not fetch each token rate based on wrong address', async () => {
const controller = new TokenRatesController() const controller = new TokenRatesController()
controller.isActive = true controller.isActive = true
controller.fetchExchangeRate = address => address
controller.tokens = [{ address: 'foo' }, { address: 'bar' }] controller.tokens = [{ address: 'foo' }, { address: 'bar' }]
await controller.updateExchangeRates() await controller.updateExchangeRates()
assert.deepEqual(controller.store.getState().contractExchangeRates, { foo: 'foo', bar: 'bar' }) assert.deepEqual(controller.store.getState().contractExchangeRates, {})
}) })
}) })

View File

@ -103,7 +103,7 @@ describe('Actions', () => {
submitPasswordSpy = sinon.stub(background, 'submitPassword') submitPasswordSpy = sinon.stub(background, 'submitPassword')
submitPasswordSpy.callsFake((password, callback) => { submitPasswordSpy.callsFake((password, hdPath, callback) => {
callback(new Error('error in submitPassword')) callback(new Error('error in submitPassword'))
}) })
@ -123,7 +123,7 @@ describe('Actions', () => {
callback(new Error('error')) callback(new Error('error'))
}) })
return store.dispatch(actions.tryUnlockMetamask('test')) return store.dispatch(actions.tryUnlockMetamask('test', `m/44'/60'/0'/0`))
.catch(() => { .catch(() => {
const actions = store.getActions() const actions = store.getActions()
const warning = actions.filter(action => action.type === 'DISPLAY_WARNING') const warning = actions.filter(action => action.type === 'DISPLAY_WARNING')
@ -342,7 +342,7 @@ describe('Actions', () => {
] ]
submitPasswordSpy = sinon.stub(background, 'submitPassword') submitPasswordSpy = sinon.stub(background, 'submitPassword')
submitPasswordSpy.callsFake((password, callback) => { submitPasswordSpy.callsFake((password, hdPath, callback) => {
callback(new Error('error')) callback(new Error('error'))
}) })
@ -415,7 +415,7 @@ describe('Actions', () => {
it('displays warning error message when submitPassword in background errors', () => { it('displays warning error message when submitPassword in background errors', () => {
submitPasswordSpy = sinon.stub(background, 'submitPassword') submitPasswordSpy = sinon.stub(background, 'submitPassword')
submitPasswordSpy.callsFake((password, callback) => { submitPasswordSpy.callsFake((password, hdPath, callback) => {
callback(new Error('error')) callback(new Error('error'))
}) })
@ -1202,7 +1202,7 @@ describe('Actions', () => {
] ]
submitPasswordSpy = sinon.stub(background, 'submitPassword') submitPasswordSpy = sinon.stub(background, 'submitPassword')
submitPasswordSpy.callsFake((password, callback) => { submitPasswordSpy.callsFake((password, hdPath, callback) => {
callback(new Error('error')) callback(new Error('error'))
}) })

View File

@ -379,14 +379,14 @@ function goHome () {
// async actions // async actions
function tryUnlockMetamask (password) { function tryUnlockMetamask (password, dPath) {
return dispatch => { return dispatch => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
dispatch(actions.unlockInProgress()) dispatch(actions.unlockInProgress())
log.debug(`background.submitPassword`) log.debug(`background.submitPassword`)
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
background.submitPassword(password, error => { background.submitPassword(password, dPath, error => {
if (error) { if (error) {
return reject(error) return reject(error)
} }
@ -526,9 +526,9 @@ function revealSeedConfirmation () {
} }
} }
function verifyPassword (password) { function verifyPassword (password, dPath) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
background.submitPassword(password, error => { background.submitPassword(password, dPath, error => {
if (error) { if (error) {
return reject(error) return reject(error)
} }
@ -550,12 +550,12 @@ function verifySeedPhrase () {
}) })
} }
function requestRevealSeed (password) { function requestRevealSeed (password, dPath) {
return dispatch => { return dispatch => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
log.debug(`background.submitPassword`) log.debug(`background.submitPassword`)
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
background.submitPassword(password, err => { background.submitPassword(password, dPath, err => {
if (err) { if (err) {
dispatch(actions.displayWarning(err)) dispatch(actions.displayWarning(err))
return reject(err) return reject(err)
@ -581,13 +581,13 @@ function requestRevealSeed (password) {
} }
} }
function requestRevealSeedWords (password) { function requestRevealSeedWords (password, dPath) {
return async dispatch => { return async dispatch => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
log.debug(`background.submitPassword`) log.debug(`background.submitPassword`)
try { try {
await verifyPassword(password) await verifyPassword(password, dPath)
const seedWords = await verifySeedPhrase() const seedWords = await verifySeedPhrase()
dispatch(actions.hideLoadingIndication()) dispatch(actions.hideLoadingIndication())
return seedWords return seedWords
@ -619,12 +619,12 @@ function resetAccount () {
} }
} }
function changePassword (oldPassword, newPassword) { function changePassword (oldPassword, newPassword, dPath) {
return dispatch => { return dispatch => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
background.changePassword(oldPassword, newPassword, (err, account) => { background.changePassword(oldPassword, newPassword, dPath, (err, account) => {
dispatch(actions.hideLoadingIndication()) dispatch(actions.hideLoadingIndication())
if (err) { if (err) {
log.error(err) log.error(err)
@ -1853,16 +1853,16 @@ function addTokens (tokens) {
return dispatch => { return dispatch => {
if (Array.isArray(tokens)) { if (Array.isArray(tokens)) {
dispatch(actions.setSelectedToken(getTokenAddressFromTokenObject(tokens[0]))) dispatch(actions.setSelectedToken(getTokenAddressFromTokenObject(tokens[0])))
return Promise.all(tokens.map(({ address, symbol, decimals, network }) => ( return Promise.all(tokens.map(({ address, symbol, decimals, image, network }) => (
dispatch(addToken(address, symbol, decimals, network)) dispatch(addToken(address, symbol, decimals, image, network))
))) )))
} else { } else {
dispatch(actions.setSelectedToken(getTokenAddressFromTokenObject(tokens))) dispatch(actions.setSelectedToken(getTokenAddressFromTokenObject(tokens)))
return Promise.all( return Promise.all(
Object Object
.entries(tokens) .entries(tokens)
.map(([_, { address, symbol, decimals, network }]) => ( .map(([_, { address, symbol, decimals, image, network }]) => (
dispatch(addToken(address, symbol, decimals, network)) dispatch(addToken(address, symbol, decimals, image, network))
)) ))
) )
} }
@ -2227,7 +2227,7 @@ function requestExportAccount () {
} }
} }
function exportAccount (password, address) { function exportAccount (password, address, dPath) {
var self = this var self = this
return function (dispatch) { return function (dispatch) {
@ -2235,7 +2235,7 @@ function exportAccount (password, address) {
log.debug(`background.submitPassword`) log.debug(`background.submitPassword`)
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
background.submitPassword(password, function (err) { background.submitPassword(password, dPath, function (err) {
if (err) { if (err) {
log.error('Error in submiting password.') log.error('Error in submiting password.')
dispatch(self.hideLoadingIndication()) dispatch(self.hideLoadingIndication())
@ -2694,7 +2694,7 @@ function setPendingTokens (pendingTokens) {
const { selectedTokens = {}, customToken = {} } = pendingTokens const { selectedTokens = {}, customToken = {} } = pendingTokens
const { address, symbol, decimals, network } = customToken const { address, symbol, decimals, network } = customToken
Object.keys(selectedTokens).forEach(address => { Object.keys(selectedTokens).forEach(address => {
selectedTokens[address].network = parseInt(network) selectedTokens[address].network = parseInt(network, 10)
}) })
const tokens = address && symbol && decimals && network const tokens = address && symbol && decimals && network
? { ...selectedTokens, [address]: { ...customToken, isCustom: true } } ? { ...selectedTokens, [address]: { ...customToken, isCustom: true } }

View File

@ -27,14 +27,15 @@ function mapStateToPropsFactory () {
network: state.metamask.network, network: state.metamask.network,
selectedIdentity, selectedIdentity,
previousModalState: state.appState.modal.previousModalState.name, previousModalState: state.appState.modal.previousModalState.name,
dPath: state.metamask.dPath,
} }
} }
} }
function mapDispatchToProps (dispatch) { function mapDispatchToProps (dispatch) {
return { return {
exportAccount: (password, address) => { exportAccount: (password, address, dPath) => {
return dispatch(actions.exportAccount(password, address)) return dispatch(actions.exportAccount(password, address, dPath))
.then((res) => { .then((res) => {
dispatch(actions.hideWarning()) dispatch(actions.hideWarning())
return res return res
@ -64,9 +65,9 @@ module.exports = connect(mapStateToPropsFactory, mapDispatchToProps)(ExportPriva
ExportPrivateKeyModal.prototype.exportAccountAndGetPrivateKey = function (password, address) { ExportPrivateKeyModal.prototype.exportAccountAndGetPrivateKey = function (password, address) {
const { exportAccount } = this.props const { exportAccount, dPath } = this.props
exportAccount(password, address) exportAccount(password, address, dPath)
.then(privateKey => this.setState({ .then(privateKey => this.setState({
privateKey, privateKey,
showWarning: false, showWarning: false,

View File

@ -54,6 +54,7 @@ function reduceMetamask (state, action) {
preferences: { preferences: {
useETHAsPrimaryCurrency: true, useETHAsPrimaryCurrency: true,
}, },
dPath: `m/44'/60'/0'/0`,
}, state.metamask) }, state.metamask)
switch (action.type) { switch (action.type) {