Update ESLint rules for curly braces style (#7477)

* eslint: Enable curly and brace-style

* yarn lint --fix
feature/default_network_editable
Whymarrh Whitby 5 years ago committed by GitHub
parent 476274474f
commit aa41057628
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      .eslintrc
  2. 4
      app/scripts/background.js
  3. 12
      app/scripts/contentscript.js
  4. 42
      app/scripts/controllers/detect-tokens.js
  5. 4
      app/scripts/controllers/incoming-transactions.js
  6. 16
      app/scripts/controllers/network/middleware/pending.js
  7. 4
      app/scripts/controllers/network/network.js
  8. 48
      app/scripts/controllers/preferences.js
  9. 4
      app/scripts/controllers/provider-approval.js
  10. 8
      app/scripts/controllers/recent-blocks.js
  11. 4
      app/scripts/controllers/threebox.js
  12. 20
      app/scripts/controllers/token-rates.js
  13. 16
      app/scripts/controllers/transactions/index.js
  14. 8
      app/scripts/controllers/transactions/lib/tx-state-history-helper.js
  15. 12
      app/scripts/controllers/transactions/lib/util.js
  16. 20
      app/scripts/controllers/transactions/pending-tx-tracker.js
  17. 8
      app/scripts/controllers/transactions/tx-gas-utils.js
  18. 24
      app/scripts/controllers/transactions/tx-state-manager.js
  19. 12
      app/scripts/lib/account-tracker.js
  20. 16
      app/scripts/lib/auto-reload.js
  21. 4
      app/scripts/lib/buy-eth-url.js
  22. 4
      app/scripts/lib/createDnodeRemoteGetter.js
  23. 4
      app/scripts/lib/createLoggerMiddleware.js
  24. 12
      app/scripts/lib/ens-ipfs/setup.js
  25. 12
      app/scripts/lib/local-store.js
  26. 12
      app/scripts/lib/message-manager.js
  27. 8
      app/scripts/lib/migrator/index.js
  28. 6
      app/scripts/lib/nodeify.js
  29. 20
      app/scripts/lib/notification-manager.js
  30. 4
      app/scripts/lib/pending-balance-calculator.js
  31. 12
      app/scripts/lib/personal-message-manager.js
  32. 4
      app/scripts/lib/setupFetchDebugging.js
  33. 4
      app/scripts/lib/setupMetamaskMeshMetrics.js
  34. 12
      app/scripts/lib/setupSentry.js
  35. 4
      app/scripts/lib/stream-utils.js
  36. 16
      app/scripts/lib/typed-message-manager.js
  37. 28
      app/scripts/metamask-controller.js
  38. 4
      app/scripts/migrations/004.js
  39. 7
      app/scripts/migrations/015.js
  40. 4
      app/scripts/migrations/016.js
  41. 4
      app/scripts/migrations/017.js
  42. 4
      app/scripts/migrations/019.js
  43. 4
      app/scripts/migrations/022.js
  44. 11
      app/scripts/migrations/023.js
  45. 4
      app/scripts/migrations/024.js
  46. 8
      app/scripts/migrations/025.js
  47. 4
      development/mock-3box.js
  48. 20
      development/show-deps-install-scripts.js
  49. 8
      development/sourcemap-validator.js
  50. 4
      gulpfile.js
  51. 12
      test/helper.js
  52. 4
      test/integration/index.js
  53. 4
      test/lib/mock-simple-keychain.js
  54. 8
      test/lib/util.js
  55. 8
      test/setup.js
  56. 12
      test/unit/actions/tx_test.js
  57. 24
      test/unit/app/controllers/metamask-controller-test.js
  58. 8
      test/unit/app/controllers/network/pending-middleware-test.js
  59. 32
      test/unit/app/controllers/preferences-controller-test.js
  60. 36
      test/unit/app/controllers/transactions/pending-tx-test.js
  61. 41
      test/unit/app/controllers/transactions/tx-controller-test.js
  62. 4
      test/unit/app/controllers/transactions/tx-state-history-helper-test.js
  63. 20
      test/unit/app/controllers/transactions/tx-utils-test.js
  64. 16
      test/unit/app/nodeify-test.js
  65. 4
      test/unit/migrations/023-test.js
  66. 7
      test/unit/migrations/024-test.js
  67. 8
      test/unit/migrations/025-test.js
  68. 4
      test/unit/migrations/027-test.js
  69. 4
      test/unit/migrations/029-test.js
  70. 4
      test/unit/migrations/migrator-test.js
  71. 4
      test/unit/test-utils.js
  72. 4
      test/unit/util_test.js
  73. 16
      ui/app/components/app/dropdowns/components/menu.js
  74. 4
      ui/app/components/app/dropdowns/network-dropdown.js
  75. 4
      ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.utils.js
  76. 4
      ui/app/components/app/input-number.js
  77. 12
      ui/app/components/app/token-list.js
  78. 8
      ui/app/components/ui/eth-balance.js
  79. 4
      ui/app/components/ui/fiat-value.js
  80. 4
      ui/app/components/ui/mascot.js
  81. 4
      ui/app/components/ui/unit-input/unit-input.component.js
  82. 4
      ui/app/ducks/index.js
  83. 40
      ui/app/helpers/utils/util.js
  84. 4
      ui/app/pages/confirm-transaction/confirm-transaction.component.js
  85. 8
      ui/app/pages/create-account/connect-hardware/connect-screen.js
  86. 4
      ui/app/pages/mobile-sync/index.js
  87. 4
      ui/app/pages/routes/index.js
  88. 12
      ui/app/pages/send/send-content/add-recipient/ens-input.component.js
  89. 4
      ui/app/pages/send/send.component.js
  90. 12
      ui/app/pages/send/send.utils.js
  91. 8
      ui/app/pages/send/tests/send-utils.test.js
  92. 4
      ui/app/pages/settings/contact-list-tab/add-contact/add-contact.component.js
  93. 20
      ui/app/store/actions.js
  94. 8
      ui/index.js

@ -49,13 +49,13 @@
"accessor-pairs": 2, "accessor-pairs": 2,
"arrow-spacing": [2, { "before": true, "after": true }], "arrow-spacing": [2, { "before": true, "after": true }],
"block-spacing": [2, "always"], "block-spacing": [2, "always"],
"brace-style": [2, "1tbs", { "allowSingleLine": true }], "brace-style": 2,
"camelcase": [2, { "properties": "never" }], "camelcase": [2, { "properties": "never" }],
"comma-dangle": [2, "always-multiline"], "comma-dangle": [2, "always-multiline"],
"comma-spacing": [2, { "before": false, "after": true }], "comma-spacing": [2, { "before": false, "after": true }],
"comma-style": [2, "last"], "comma-style": [2, "last"],
"constructor-super": 2, "constructor-super": 2,
"curly": [2, "multi-line"], "curly": 2,
"dot-location": [2, "property"], "dot-location": [2, "property"],
"eol-last": 2, "eol-last": 2,
"eqeqeq": [2, "allow-null"], "eqeqeq": [2, "allow-null"],

@ -260,7 +260,9 @@ function setupController (initState, initLangCode) {
// report failed transactions to Sentry // report failed transactions to Sentry
controller.txController.on(`tx:status-update`, (txId, status) => { controller.txController.on(`tx:status-update`, (txId, status) => {
if (status !== 'failed') return if (status !== 'failed') {
return
}
const txMeta = controller.txController.txStateManager.getTx(txId) const txMeta = controller.txController.txStateManager.getTx(txId)
try { try {
reportFailedTxToSentry({ sentry, txMeta }) reportFailedTxToSentry({ sentry, txMeta })

@ -123,7 +123,9 @@ async function setupPublicApi (outStream) {
outStream, outStream,
(err) => { (err) => {
// report any error // report any error
if (err) log.error(err) if (err) {
log.error(err)
}
} }
) )
const background = await new Promise(resolve => dnode.once('remote', resolve)) const background = await new Promise(resolve => dnode.once('remote', resolve))
@ -151,7 +153,9 @@ function getSiteMetadata () {
*/ */
function logStreamDisconnectWarning (remoteLabel, err) { function logStreamDisconnectWarning (remoteLabel, err) {
let warningMsg = `MetamaskContentscript - lost connection to ${remoteLabel}` let warningMsg = `MetamaskContentscript - lost connection to ${remoteLabel}`
if (err) warningMsg += '\n' + err.stack if (err) {
warningMsg += '\n' + err.stack
}
console.warn(warningMsg) console.warn(warningMsg)
} }
@ -302,7 +306,9 @@ function getSiteIcon (window) {
*/ */
async function domIsReady () { async function domIsReady () {
// already loaded // already loaded
if (['interactive', 'complete'].includes(document.readyState)) return if (['interactive', 'complete'].includes(document.readyState)) {
return
}
// wait for load // wait for load
await new Promise(resolve => window.addEventListener('DOMContentLoaded', resolve, { once: true })) await new Promise(resolve => window.addEventListener('DOMContentLoaded', resolve, { once: true }))
} }

@ -29,8 +29,12 @@ class DetectTokensController {
* *
*/ */
async detectNewTokens () { async detectNewTokens () {
if (!this.isActive) { return } if (!this.isActive) {
if (this._network.store.getState().provider.type !== MAINNET) { return } return
}
if (this._network.store.getState().provider.type !== MAINNET) {
return
}
const tokensToDetect = [] const tokensToDetect = []
this.web3.setProvider(this._network._provider) this.web3.setProvider(this._network._provider)
for (const contractAddress in contracts) { for (const contractAddress in contracts) {
@ -80,7 +84,9 @@ class DetectTokensController {
* *
*/ */
restartTokenDetection () { restartTokenDetection () {
if (!(this.isActive && this.selectedAddress)) { return } if (!(this.isActive && this.selectedAddress)) {
return
}
this.detectNewTokens() this.detectNewTokens()
this.interval = DEFAULT_INTERVAL this.interval = DEFAULT_INTERVAL
} }
@ -90,8 +96,12 @@ class DetectTokensController {
*/ */
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.detectNewTokens() }, interval) return
}
this._handle = setInterval(() => {
this.detectNewTokens()
}, interval)
} }
/** /**
@ -99,9 +109,15 @@ class DetectTokensController {
* @type {Object} * @type {Object}
*/ */
set preferences (preferences) { set preferences (preferences) {
if (!preferences) { return } if (!preferences) {
return
}
this._preferences = preferences this._preferences = preferences
preferences.store.subscribe(({ tokens = [] }) => { this.tokenAddresses = tokens.map((obj) => { return obj.address }) }) preferences.store.subscribe(({ tokens = [] }) => {
this.tokenAddresses = tokens.map((obj) => {
return obj.address
})
})
preferences.store.subscribe(({ selectedAddress }) => { preferences.store.subscribe(({ selectedAddress }) => {
if (this.selectedAddress !== selectedAddress) { if (this.selectedAddress !== selectedAddress) {
this.selectedAddress = selectedAddress this.selectedAddress = selectedAddress
@ -114,7 +130,9 @@ class DetectTokensController {
* @type {Object} * @type {Object}
*/ */
set network (network) { set network (network) {
if (!network) { return } if (!network) {
return
}
this._network = network this._network = network
this.web3 = new Web3(network._provider) this.web3 = new Web3(network._provider)
} }
@ -124,12 +142,16 @@ class DetectTokensController {
* @type {Object} * @type {Object}
*/ */
set keyringMemStore (keyringMemStore) { set keyringMemStore (keyringMemStore) {
if (!keyringMemStore) { return } if (!keyringMemStore) {
return
}
this._keyringMemStore = keyringMemStore this._keyringMemStore = keyringMemStore
this._keyringMemStore.subscribe(({ isUnlocked }) => { this._keyringMemStore.subscribe(({ isUnlocked }) => {
if (this.isUnlocked !== isUnlocked) { if (this.isUnlocked !== isUnlocked) {
this.isUnlocked = isUnlocked this.isUnlocked = isUnlocked
if (isUnlocked) { this.restartTokenDetection() } if (isUnlocked) {
this.restartTokenDetection()
}
} }
}) })
} }

@ -163,7 +163,9 @@ class IncomingTransactionsController {
const newIncomingTransactions = { const newIncomingTransactions = {
...currentIncomingTxs, ...currentIncomingTxs,
} }
newTxs.forEach(tx => { newIncomingTransactions[tx.hash] = tx }) newTxs.forEach(tx => {
newIncomingTransactions[tx.hash] = tx
})
this.store.updateState({ this.store.updateState({
incomingTxLastFetchedBlocksByNetwork: { incomingTxLastFetchedBlocksByNetwork: {

@ -4,9 +4,13 @@ const createAsyncMiddleware = require('json-rpc-engine/src/createAsyncMiddleware
function createPendingNonceMiddleware ({ getPendingNonce }) { function createPendingNonceMiddleware ({ getPendingNonce }) {
return createAsyncMiddleware(async (req, res, next) => { return createAsyncMiddleware(async (req, res, next) => {
const {method, params} = req const {method, params} = req
if (method !== 'eth_getTransactionCount') return next() if (method !== 'eth_getTransactionCount') {
return next()
}
const [param, blockRef] = params const [param, blockRef] = params
if (blockRef !== 'pending') return next() if (blockRef !== 'pending') {
return next()
}
res.result = await getPendingNonce(param) res.result = await getPendingNonce(param)
}) })
} }
@ -14,10 +18,14 @@ function createPendingNonceMiddleware ({ getPendingNonce }) {
function createPendingTxMiddleware ({ getPendingTransactionByHash }) { function createPendingTxMiddleware ({ getPendingTransactionByHash }) {
return createAsyncMiddleware(async (req, res, next) => { return createAsyncMiddleware(async (req, res, next) => {
const {method, params} = req const {method, params} = req
if (method !== 'eth_getTransactionByHash') return next() if (method !== 'eth_getTransactionByHash') {
return next()
}
const [hash] = params const [hash] = params
const txMeta = getPendingTransactionByHash(hash) const txMeta = getPendingTransactionByHash(hash)
if (!txMeta) return next() if (!txMeta) {
return next()
}
res.result = formatTxMetaForRpcResult(txMeta) res.result = formatTxMetaForRpcResult(txMeta)
}) })
} }

@ -81,7 +81,9 @@ module.exports = class NetworkController extends EventEmitter {
verifyNetwork () { verifyNetwork () {
// Check network when restoring connectivity: // Check network when restoring connectivity:
if (this.isNetworkLoading()) this.lookupNetwork() if (this.isNetworkLoading()) {
this.lookupNetwork()
}
} }
getNetworkState () { getNetworkState () {

@ -303,7 +303,9 @@ class PreferencesController {
const accountTokens = this.store.getState().accountTokens const accountTokens = this.store.getState().accountTokens
addresses.forEach((address) => { addresses.forEach((address) => {
// skip if already exists // skip if already exists
if (identities[address]) return if (identities[address]) {
return
}
// add missing identity // add missing identity
const identityCount = Object.keys(identities).length const identityCount = Object.keys(identities).length
@ -335,7 +337,9 @@ class PreferencesController {
if (Object.keys(newlyLost).length > 0) { if (Object.keys(newlyLost).length > 0) {
// Notify our servers: // Notify our servers:
if (this.diagnostics) this.diagnostics.reportOrphans(newlyLost) if (this.diagnostics) {
this.diagnostics.reportOrphans(newlyLost)
}
// store lost accounts // store lost accounts
for (const key in newlyLost) { for (const key in newlyLost) {
@ -463,7 +467,9 @@ class PreferencesController {
* @return {Promise<string>} * @return {Promise<string>}
*/ */
setAccountLabel (account, label) { setAccountLabel (account, label) {
if (!account) throw new Error('setAccountLabel requires a valid address, got ' + String(account)) if (!account) {
throw new Error('setAccountLabel requires a valid address, got ' + String(account))
}
const address = normalizeAddress(account) const address = normalizeAddress(account)
const {identities} = this.store.getState() const {identities} = this.store.getState()
identities[address] = identities[address] || {} identities[address] = identities[address] || {}
@ -500,7 +506,9 @@ class PreferencesController {
updateRpc (newRpcDetails) { updateRpc (newRpcDetails) {
const rpcList = this.getFrequentRpcListDetail() const rpcList = this.getFrequentRpcListDetail()
const index = rpcList.findIndex((element) => { return element.rpcUrl === newRpcDetails.rpcUrl }) const index = rpcList.findIndex((element) => {
return element.rpcUrl === newRpcDetails.rpcUrl
})
if (index > -1) { if (index > -1) {
const rpcDetail = rpcList[index] const rpcDetail = rpcList[index]
const updatedRpc = extend(rpcDetail, newRpcDetails) const updatedRpc = extend(rpcDetail, newRpcDetails)
@ -524,7 +532,9 @@ class PreferencesController {
*/ */
addToFrequentRpcList (url, chainId, ticker = 'ETH', nickname = '', rpcPrefs = {}) { addToFrequentRpcList (url, chainId, ticker = 'ETH', nickname = '', rpcPrefs = {}) {
const rpcList = this.getFrequentRpcListDetail() const rpcList = this.getFrequentRpcListDetail()
const index = rpcList.findIndex((element) => { return element.rpcUrl === url }) const index = rpcList.findIndex((element) => {
return element.rpcUrl === url
})
if (index !== -1) { if (index !== -1) {
rpcList.splice(index, 1) rpcList.splice(index, 1)
} }
@ -548,7 +558,9 @@ class PreferencesController {
*/ */
removeFromFrequentRpcList (url) { removeFromFrequentRpcList (url) {
const rpcList = this.getFrequentRpcListDetail() const rpcList = this.getFrequentRpcListDetail()
const index = rpcList.findIndex((element) => { return element.rpcUrl === url }) const index = rpcList.findIndex((element) => {
return element.rpcUrl === url
})
if (index !== -1) { if (index !== -1) {
rpcList.splice(index, 1) rpcList.splice(index, 1)
} }
@ -687,10 +699,16 @@ class PreferencesController {
*/ */
_getTokenRelatedStates (selectedAddress) { _getTokenRelatedStates (selectedAddress) {
const accountTokens = this.store.getState().accountTokens const accountTokens = this.store.getState().accountTokens
if (!selectedAddress) selectedAddress = this.store.getState().selectedAddress if (!selectedAddress) {
selectedAddress = this.store.getState().selectedAddress
}
const providerType = this.network.providerStore.getState().type const providerType = this.network.providerStore.getState().type
if (!(selectedAddress in accountTokens)) accountTokens[selectedAddress] = {} if (!(selectedAddress in accountTokens)) {
if (!(providerType in accountTokens[selectedAddress])) accountTokens[selectedAddress][providerType] = [] accountTokens[selectedAddress] = {}
}
if (!(providerType in accountTokens[selectedAddress])) {
accountTokens[selectedAddress][providerType] = []
}
const tokens = accountTokens[selectedAddress][providerType] const tokens = accountTokens[selectedAddress][providerType]
return { tokens, accountTokens, providerType, selectedAddress } return { tokens, accountTokens, providerType, selectedAddress }
} }
@ -727,13 +745,19 @@ class PreferencesController {
*/ */
_validateERC20AssetParams (opts) { _validateERC20AssetParams (opts) {
const { rawAddress, symbol, decimals } = opts const { rawAddress, symbol, decimals } = opts
if (!rawAddress || !symbol || typeof decimals === 'undefined') throw new Error(`Cannot suggest token without address, symbol, and decimals`) if (!rawAddress || !symbol || typeof decimals === 'undefined') {
if (!(symbol.length < 7)) throw new Error(`Invalid symbol ${symbol} more than six characters`) throw new Error(`Cannot suggest token without address, symbol, and decimals`)
}
if (!(symbol.length < 7)) {
throw new Error(`Invalid symbol ${symbol} more than six characters`)
}
const numDecimals = parseInt(decimals, 10) const numDecimals = parseInt(decimals, 10)
if (isNaN(numDecimals) || numDecimals > 36 || numDecimals < 0) { if (isNaN(numDecimals) || numDecimals > 36 || numDecimals < 0) {
throw new Error(`Invalid decimals ${decimals} must be at least 0, and not over 36`) throw new Error(`Invalid decimals ${decimals} must be at least 0, and not over 36`)
} }
if (!isValidAddress(rawAddress)) throw new Error(`Invalid address ${rawAddress}`) if (!isValidAddress(rawAddress)) {
throw new Error(`Invalid address ${rawAddress}`)
}
} }
} }

@ -34,7 +34,9 @@ class ProviderApprovalController extends SafeEventEmitter {
createMiddleware ({ senderUrl, extensionId, getSiteMetadata }) { createMiddleware ({ senderUrl, extensionId, getSiteMetadata }) {
return createAsyncMiddleware(async (req, res, next) => { return createAsyncMiddleware(async (req, res, next) => {
// only handle requestAccounts // only handle requestAccounts
if (req.method !== 'eth_requestAccounts') return next() if (req.method !== 'eth_requestAccounts') {
return next()
}
// if already approved or privacy mode disabled, return early // if already approved or privacy mode disabled, return early
const isUnlocked = this.keyringController.memStore.getState().isUnlocked const isUnlocked = this.keyringController.memStore.getState().isUnlocked
const origin = senderUrl.hostname const origin = senderUrl.hostname

@ -90,7 +90,9 @@ class RecentBlocksController {
async processBlock (newBlockNumberHex) { async processBlock (newBlockNumberHex) {
const newBlockNumber = Number.parseInt(newBlockNumberHex, 16) const newBlockNumber = Number.parseInt(newBlockNumberHex, 16)
const newBlock = await this.getBlockByNumber(newBlockNumber, true) const newBlock = await this.getBlockByNumber(newBlockNumber, true)
if (!newBlock) return if (!newBlock) {
return
}
const block = this.mapTransactionsToPrices(newBlock) const block = this.mapTransactionsToPrices(newBlock)
@ -162,7 +164,9 @@ class RecentBlocksController {
await Promise.all(targetBlockNumbers.map(async (targetBlockNumber) => { await Promise.all(targetBlockNumbers.map(async (targetBlockNumber) => {
try { try {
const newBlock = await this.getBlockByNumber(targetBlockNumber, true) const newBlock = await this.getBlockByNumber(targetBlockNumber, true)
if (!newBlock) return if (!newBlock) {
return
}
this.backfillBlock(newBlock) this.backfillBlock(newBlock)
} catch (e) { } catch (e) {

@ -28,7 +28,9 @@ class ThreeBoxController {
this.provider = this._createProvider({ this.provider = this._createProvider({
version, version,
getAccounts: async ({ origin }) => { getAccounts: async ({ origin }) => {
if (origin !== '3Box') { return [] } if (origin !== '3Box') {
return []
}
const isUnlocked = getKeyringControllerState().isUnlocked const isUnlocked = getKeyringControllerState().isUnlocked
const accounts = await this.keyringController.getAccounts() const accounts = await this.keyringController.getAccounts()

@ -28,7 +28,9 @@ 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 = {}
const nativeCurrency = this.currency ? this.currency.state.nativeCurrency.toLowerCase() : 'eth' const nativeCurrency = this.currency ? this.currency.state.nativeCurrency.toLowerCase() : 'eth'
const pairs = this._tokens.map(token => token.address).join(',') const pairs = this._tokens.map(token => token.address).join(',')
@ -53,8 +55,12 @@ class TokenRatesController {
*/ */
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)
} }
/** /**
@ -62,10 +68,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
})
} }
/** /**

@ -402,7 +402,9 @@ class TransactionController extends EventEmitter {
log.error(err) log.error(err)
} }
// must set transaction to submitted/failed before releasing lock // must set transaction to submitted/failed before releasing lock
if (nonceLock) nonceLock.releaseLock() if (nonceLock) {
nonceLock.releaseLock()
}
// continue with error chain // continue with error chain
throw err throw err
} finally { } finally {
@ -603,7 +605,9 @@ class TransactionController extends EventEmitter {
} }
}) })
this.pendingTxTracker.on('tx:retry', (txMeta) => { this.pendingTxTracker.on('tx:retry', (txMeta) => {
if (!('retryCount' in txMeta)) txMeta.retryCount = 0 if (!('retryCount' in txMeta)) {
txMeta.retryCount = 0
}
txMeta.retryCount++ txMeta.retryCount++
this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:retry') this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:retry')
}) })
@ -657,10 +661,14 @@ class TransactionController extends EventEmitter {
const txMeta = this.txStateManager.getTx(txId) const txMeta = this.txStateManager.getTx(txId)
const { nonce, from } = txMeta.txParams const { nonce, from } = txMeta.txParams
const sameNonceTxs = this.txStateManager.getFilteredTxList({nonce, from}) const sameNonceTxs = this.txStateManager.getFilteredTxList({nonce, from})
if (!sameNonceTxs.length) return if (!sameNonceTxs.length) {
return
}
// mark all same nonce transactions as dropped and give i a replacedBy hash // mark all same nonce transactions as dropped and give i a replacedBy hash
sameNonceTxs.forEach((otherTxMeta) => { sameNonceTxs.forEach((otherTxMeta) => {
if (otherTxMeta.id === txId) return if (otherTxMeta.id === txId) {
return
}
otherTxMeta.replacedBy = txMeta.hash otherTxMeta.replacedBy = txMeta.hash
this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:confirmed reference to confirmed txHash with same nonce') this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:confirmed reference to confirmed txHash with same nonce')
this.txStateManager.setTxStatusDropped(otherTxMeta.id) this.txStateManager.setTxStatusDropped(otherTxMeta.id)

@ -18,7 +18,9 @@ function migrateFromSnapshotsToDiffs (longHistory) {
longHistory longHistory
// convert non-initial history entries into diffs // convert non-initial history entries into diffs
.map((entry, index) => { .map((entry, index) => {
if (index === 0) return entry if (index === 0) {
return entry
}
return generateHistoryEntry(longHistory[index - 1], entry) return generateHistoryEntry(longHistory[index - 1], entry)
}) })
) )
@ -40,7 +42,9 @@ function generateHistoryEntry (previousState, newState, note) {
const entry = jsonDiffer.compare(previousState, newState) const entry = jsonDiffer.compare(previousState, newState)
// Add a note to the first op, since it breaks if we append it to the entry // Add a note to the first op, since it breaks if we append it to the entry
if (entry[0]) { if (entry[0]) {
if (note) entry[0].note = note if (note) {
entry[0].note = note
}
entry[0].timestamp = Date.now() entry[0].timestamp = Date.now()
} }

@ -35,7 +35,9 @@ function normalizeTxParams (txParams, LowerCase) {
// apply only keys in the normalizers // apply only keys in the normalizers
const normalizedTxParams = {} const normalizedTxParams = {}
for (const key in normalizers) { for (const key in normalizers) {
if (txParams[key]) normalizedTxParams[key] = normalizers[key](txParams[key], LowerCase) if (txParams[key]) {
normalizedTxParams[key] = normalizers[key](txParams[key], LowerCase)
}
} }
return normalizedTxParams return normalizedTxParams
} }
@ -64,8 +66,12 @@ function validateTxParams (txParams) {
@param txParams {object} @param txParams {object}
*/ */
function validateFrom (txParams) { function validateFrom (txParams) {
if (!(typeof txParams.from === 'string')) throw new Error(`Invalid from address ${txParams.from} not a string`) if (!(typeof txParams.from === 'string')) {
if (!isValidAddress(txParams.from)) throw new Error('Invalid from address') throw new Error(`Invalid from address ${txParams.from} not a string`)
}
if (!isValidAddress(txParams.from)) {
throw new Error('Invalid from address')
}
} }
/** /**

@ -56,7 +56,9 @@ class PendingTransactionTracker extends EventEmitter {
resubmitPendingTxs (blockNumber) { resubmitPendingTxs (blockNumber) {
const pending = this.getPendingTransactions() const pending = this.getPendingTransactions()
// only try resubmitting if their are transactions to resubmit // only try resubmitting if their are transactions to resubmit
if (!pending.length) return if (!pending.length) {
return
}
pending.forEach((txMeta) => this._resubmitTx(txMeta, blockNumber).catch((err) => { pending.forEach((txMeta) => this._resubmitTx(txMeta, blockNumber).catch((err) => {
/* /*
Dont marked as failed if the error is a "known" transaction warning Dont marked as failed if the error is a "known" transaction warning
@ -79,7 +81,9 @@ class PendingTransactionTracker extends EventEmitter {
errorMessage.includes('nonce too low') errorMessage.includes('nonce too low')
) )
// ignore resubmit warnings, return early // ignore resubmit warnings, return early
if (isKnownTx) return if (isKnownTx) {
return
}
// encountered real error - transition to error state // encountered real error - transition to error state
txMeta.warning = { txMeta.warning = {
error: errorMessage, error: errorMessage,
@ -107,10 +111,14 @@ class PendingTransactionTracker extends EventEmitter {
const retryCount = txMeta.retryCount || 0 const retryCount = txMeta.retryCount || 0
// Exponential backoff to limit retries at publishing // Exponential backoff to limit retries at publishing
if (txBlockDistance <= Math.pow(2, retryCount) - 1) return if (txBlockDistance <= Math.pow(2, retryCount) - 1) {
return
}
// Only auto-submit already-signed txs: // Only auto-submit already-signed txs:
if (!('rawTx' in txMeta)) return this.approveTransaction(txMeta.id) if (!('rawTx' in txMeta)) {
return this.approveTransaction(txMeta.id)
}
const rawTx = txMeta.rawTx const rawTx = txMeta.rawTx
const txHash = await this.publishTransaction(rawTx) const txHash = await this.publishTransaction(rawTx)
@ -132,7 +140,9 @@ class PendingTransactionTracker extends EventEmitter {
const txId = txMeta.id const txId = txMeta.id
// Only check submitted txs // Only check submitted txs
if (txMeta.status !== 'submitted') return if (txMeta.status !== 'submitted') {
return
}
// extra check in case there was an uncaught error during the // extra check in case there was an uncaught error during the
// signature and submission process // signature and submission process

@ -142,9 +142,13 @@ class TxGasUtil {
const bufferedGasLimitBn = initialGasLimitBn.muln(1.5) const bufferedGasLimitBn = initialGasLimitBn.muln(1.5)
// if initialGasLimit is above blockGasLimit, dont modify it // if initialGasLimit is above blockGasLimit, dont modify it
if (initialGasLimitBn.gt(upperGasLimitBn)) return bnToHex(initialGasLimitBn) if (initialGasLimitBn.gt(upperGasLimitBn)) {
return bnToHex(initialGasLimitBn)
}
// if bufferedGasLimit is below blockGasLimit, use bufferedGasLimit // if bufferedGasLimit is below blockGasLimit, use bufferedGasLimit
if (bufferedGasLimitBn.lt(upperGasLimitBn)) return bnToHex(bufferedGasLimitBn) if (bufferedGasLimitBn.lt(upperGasLimitBn)) {
return bnToHex(bufferedGasLimitBn)
}
// otherwise use blockGasLimit // otherwise use blockGasLimit
return bnToHex(upperGasLimitBn) return bnToHex(upperGasLimitBn)
} }

@ -45,7 +45,9 @@ class TransactionStateManager extends EventEmitter {
*/ */
generateTxMeta (opts) { generateTxMeta (opts) {
const netId = this.getNetwork() const netId = this.getNetwork()
if (netId === 'loading') throw new Error('MetaMask is having trouble connecting to the network') if (netId === 'loading') {
throw new Error('MetaMask is having trouble connecting to the network')
}
return extend({ return extend({
id: createId(), id: createId(),
time: (new Date()).getTime(), time: (new Date()).getTime(),
@ -89,7 +91,9 @@ class TransactionStateManager extends EventEmitter {
*/ */
getApprovedTransactions (address) { getApprovedTransactions (address) {
const opts = { status: 'approved' } const opts = { status: 'approved' }
if (address) opts.from = address if (address) {
opts.from = address
}
return this.getFilteredTxList(opts) return this.getFilteredTxList(opts)
} }
@ -100,7 +104,9 @@ class TransactionStateManager extends EventEmitter {
*/ */
getPendingTransactions (address) { getPendingTransactions (address) {
const opts = { status: 'submitted' } const opts = { status: 'submitted' }
if (address) opts.from = address if (address) {
opts.from = address
}
return this.getFilteredTxList(opts) return this.getFilteredTxList(opts)
} }
@ -111,7 +117,9 @@ class TransactionStateManager extends EventEmitter {
*/ */
getConfirmedTransactions (address) { getConfirmedTransactions (address) {
const opts = { status: 'confirmed' } const opts = { status: 'confirmed' }
if (address) opts.from = address if (address) {
opts.from = address
}
return this.getFilteredTxList(opts) return this.getFilteredTxList(opts)
} }
@ -236,10 +244,14 @@ class TransactionStateManager extends EventEmitter {
// validate types // validate types
switch (key) { switch (key) {
case 'chainId': case 'chainId':
if (typeof value !== 'number' && typeof value !== 'string') throw new Error(`${key} in txParams is not a Number or hex string. got: (${value})`) if (typeof value !== 'number' && typeof value !== 'string') {
throw new Error(`${key} in txParams is not a Number or hex string. got: (${value})`)
}
break break
default: default:
if (typeof value !== 'string') throw new Error(`${key} in txParams is not a string. got: (${value})`) if (typeof value !== 'string') {
throw new Error(`${key} in txParams is not a string. got: (${value})`)
}
break break
} }
}) })

@ -124,7 +124,9 @@ class AccountTracker {
// save accounts state // save accounts state
this.store.updateState({ accounts }) this.store.updateState({ accounts })
// fetch balances for the accounts if there is block number ready // fetch balances for the accounts if there is block number ready
if (!this._currentBlockNumber) return if (!this._currentBlockNumber) {
return
}
this._updateAccounts() this._updateAccounts()
} }
@ -158,7 +160,9 @@ class AccountTracker {
// block gasLimit polling shouldn't be in account-tracker shouldn't be here... // block gasLimit polling shouldn't be in account-tracker shouldn't be here...
const currentBlock = await this._query.getBlockByNumber(blockNumber, false) const currentBlock = await this._query.getBlockByNumber(blockNumber, false)
if (!currentBlock) return if (!currentBlock) {
return
}
const currentBlockGasLimit = currentBlock.gasLimit const currentBlockGasLimit = currentBlock.gasLimit
this.store.updateState({ currentBlockGasLimit }) this.store.updateState({ currentBlockGasLimit })
@ -218,7 +222,9 @@ class AccountTracker {
// update accounts state // update accounts state
const { accounts } = this.store.getState() const { accounts } = this.store.getState()
// only populate if the entry is still present // only populate if the entry is still present
if (!accounts[address]) return if (!accounts[address]) {
return
}
accounts[address] = result accounts[address] = result
this.store.updateState({ accounts }) this.store.updateState({ accounts })
} }

@ -28,10 +28,14 @@ function setupDappAutoReload (web3, observable) {
observable.subscribe(function (state) { observable.subscribe(function (state) {
// if the auto refresh on network change is false do not // if the auto refresh on network change is false do not
// do anything // do anything
if (!window.ethereum.autoRefreshOnNetworkChange) return if (!window.ethereum.autoRefreshOnNetworkChange) {
return
}
// if reload in progress, no need to check reload logic // if reload in progress, no need to check reload logic
if (reloadInProgress) return if (reloadInProgress) {
return
}
const currentNetwork = state.networkVersion const currentNetwork = state.networkVersion
@ -42,10 +46,14 @@ function setupDappAutoReload (web3, observable) {
} }
// skip reload logic if web3 not used // skip reload logic if web3 not used
if (!lastTimeUsed) return if (!lastTimeUsed) {
return
}
// if network did not change, exit // if network did not change, exit
if (currentNetwork === lastSeenNetwork) return if (currentNetwork === lastSeenNetwork) {
return
}
// initiate page reload // initiate page reload
reloadInProgress = true reloadInProgress = true

@ -13,7 +13,9 @@ module.exports = getBuyEthUrl
*/ */
function getBuyEthUrl ({ network, amount, address, service }) { function getBuyEthUrl ({ network, amount, address, service }) {
// default service by network if not specified // default service by network if not specified
if (!service) service = getDefaultServiceForNetwork(network) if (!service) {
service = getDefaultServiceForNetwork(network)
}
switch (service) { switch (service) {
case 'wyre': case 'wyre':

@ -8,7 +8,9 @@ function createDnodeRemoteGetter (dnode) {
}) })
async function getRemote () { async function getRemote () {
if (remote) return remote if (remote) {
return remote
}
return await new Promise(resolve => dnode.once('remote', resolve)) return await new Promise(resolve => dnode.once('remote', resolve))
} }

@ -13,7 +13,9 @@ function createLoggerMiddleware (opts) {
if (res.error) { if (res.error) {
log.error('Error in RPC response:\n', res) log.error('Error in RPC response:\n', res)
} }
if (req.isMetamaskInternal) return if (req.isMetamaskInternal) {
return
}
log.info(`RPC (${opts.origin}):`, req, '->', res) log.info(`RPC (${opts.origin}):`, req, '->', res)
cb() cb()
}) })

@ -23,14 +23,18 @@ function setupEnsIpfsResolver ({ provider }) {
async function webRequestDidFail (details) { async function webRequestDidFail (details) {
const { tabId, url } = details const { tabId, url } = details
// ignore requests that are not associated with tabs // ignore requests that are not associated with tabs
if (tabId === -1) return if (tabId === -1) {
return
}
// parse ens name // parse ens name
const urlData = urlUtil.parse(url) const urlData = urlUtil.parse(url)
const { hostname: name, path, search } = urlData const { hostname: name, path, search } = urlData
const domainParts = name.split('.') const domainParts = name.split('.')
const topLevelDomain = domainParts[domainParts.length - 1] const topLevelDomain = domainParts[domainParts.length - 1]
// if unsupported TLD, abort // if unsupported TLD, abort
if (!supportedTopLevelDomains.includes(topLevelDomain)) return if (!supportedTopLevelDomains.includes(topLevelDomain)) {
return
}
// otherwise attempt resolve // otherwise attempt resolve
attemptResolve({ tabId, name, path, search }) attemptResolve({ tabId, name, path, search })
} }
@ -45,7 +49,9 @@ function setupEnsIpfsResolver ({ provider }) {
try { try {
// check if ipfs gateway has result // check if ipfs gateway has result
const response = await fetch(resolvedUrl, { method: 'HEAD' }) const response = await fetch(resolvedUrl, { method: 'HEAD' })
if (response.status === 200) url = resolvedUrl if (response.status === 200) {
url = resolvedUrl
}
} catch (err) { } catch (err) {
console.warn(err) console.warn(err)
} }

@ -20,7 +20,9 @@ module.exports = class ExtensionStore {
* @return {Promise<*>} * @return {Promise<*>}
*/ */
async get () { async get () {
if (!this.isSupported) return undefined if (!this.isSupported) {
return undefined
}
const result = await this._get() const result = await this._get()
// extension.storage.local always returns an obj // extension.storage.local always returns an obj
// if the object is empty, treat it as undefined // if the object is empty, treat it as undefined
@ -96,9 +98,13 @@ function isEmpty (obj) {
*/ */
function checkForError () { function checkForError () {
const lastError = extension.runtime.lastError const lastError = extension.runtime.lastError
if (!lastError) return if (!lastError) {
return
}
// if it quacks like an Error, its an Error // if it quacks like an Error, its an Error
if (lastError.stack && lastError.message) return lastError if (lastError.stack && lastError.message) {
return lastError
}
// repair incomplete error object (eg chromium v77) // repair incomplete error object (eg chromium v77)
return new Error(lastError.message) return new Error(lastError.message)
} }

@ -62,7 +62,9 @@ module.exports = class MessageManager extends EventEmitter {
*/ */
getUnapprovedMsgs () { getUnapprovedMsgs () {
return this.messages.filter(msg => msg.status === 'unapproved') return this.messages.filter(msg => msg.status === 'unapproved')
.reduce((result, msg) => { result[msg.id] = msg; return result }, {}) .reduce((result, msg) => {
result[msg.id] = msg; return result
}, {})
} }
/** /**
@ -102,7 +104,9 @@ module.exports = class MessageManager extends EventEmitter {
*/ */
addUnapprovedMessage (msgParams, req) { addUnapprovedMessage (msgParams, req) {
// add origin from request // add origin from request
if (req) msgParams.origin = req.origin if (req) {
msgParams.origin = req.origin
}
msgParams.data = normalizeMsgData(msgParams.data) msgParams.data = normalizeMsgData(msgParams.data)
// create txData obj with parameters and meta data // create txData obj with parameters and meta data
var time = (new Date()).getTime() var time = (new Date()).getTime()
@ -219,7 +223,9 @@ module.exports = class MessageManager extends EventEmitter {
*/ */
_setMsgStatus (msgId, status) { _setMsgStatus (msgId, status) {
const msg = this.getMsg(msgId) const msg = this.getMsg(msgId)
if (!msg) throw new Error('MessageManager - Message not found for id: "${msgId}".') if (!msg) {
throw new Error('MessageManager - Message not found for id: "${msgId}".')
}
msg.status = status msg.status = status
this._updateMsg(msg) this._updateMsg(msg)
this.emit(`${msgId}:${status}`, msg) this.emit(`${msgId}:${status}`, msg)

@ -40,8 +40,12 @@ class Migrator extends EventEmitter {
try { try {
// attempt migration and validate // attempt migration and validate
const migratedData = await migration.migrate(versionedData) const migratedData = await migration.migrate(versionedData)
if (!migratedData.data) throw new Error('Migrator - migration returned empty data') if (!migratedData.data) {
if (migratedData.version !== undefined && migratedData.meta.version !== migration.version) throw new Error('Migrator - Migration did not update version number correctly') throw new Error('Migrator - migration returned empty data')
}
if (migratedData.version !== undefined && migratedData.meta.version !== migration.version) {
throw new Error('Migrator - Migration did not update version number correctly')
}
// accept the migration as good // accept the migration as good
versionedData = migratedData versionedData = migratedData
} catch (err) { } catch (err) {

@ -1,5 +1,9 @@
const promiseToCallback = require('promise-to-callback') const promiseToCallback = require('promise-to-callback')
const callbackNoop = function (err) { if (err) throw err } const callbackNoop = function (err) {
if (err) {
throw err
}
}
/** /**
* A generator that returns a function which, when passed a promise, can treat that promise as a node style callback. * A generator that returns a function which, when passed a promise, can treat that promise as a node style callback.

@ -18,7 +18,9 @@ class NotificationManager {
*/ */
showPopup () { showPopup () {
this._getPopup((err, popup) => { this._getPopup((err, popup) => {
if (err) throw err if (err) {
throw err
}
// Bring focus to chrome popup // Bring focus to chrome popup
if (popup) { if (popup) {
@ -28,7 +30,9 @@ class NotificationManager {
const {screenX, screenY, outerWidth, outerHeight} = window const {screenX, screenY, outerWidth, outerHeight} = window
const notificationTop = Math.round(screenY + (outerHeight / 2) - (NOTIFICATION_HEIGHT / 2)) const notificationTop = Math.round(screenY + (outerHeight / 2) - (NOTIFICATION_HEIGHT / 2))
const notificationLeft = Math.round(screenX + (outerWidth / 2) - (NOTIFICATION_WIDTH / 2)) const notificationLeft = Math.round(screenX + (outerWidth / 2) - (NOTIFICATION_WIDTH / 2))
const cb = (currentPopup) => { this._popupId = currentPopup.id } const cb = (currentPopup) => {
this._popupId = currentPopup.id
}
// create new notification popup // create new notification popup
const creation = extension.windows.create({ const creation = extension.windows.create({
url: 'notification.html', url: 'notification.html',
@ -50,8 +54,12 @@ class NotificationManager {
closePopup () { closePopup () {
// closes notification popup // closes notification popup
this._getPopup((err, popup) => { this._getPopup((err, popup) => {
if (err) throw err if (err) {
if (!popup) return throw err
}
if (!popup) {
return
}
extension.windows.remove(popup.id, console.error) extension.windows.remove(popup.id, console.error)
}) })
} }
@ -66,7 +74,9 @@ class NotificationManager {
*/ */
_getPopup (cb) { _getPopup (cb) {
this._getWindows((err, windows) => { this._getWindows((err, windows) => {
if (err) throw err if (err) {
throw err
}
cb(null, this._getPopupIn(windows)) cb(null, this._getPopupIn(windows))
}) })
} }

@ -32,7 +32,9 @@ class PendingBalanceCalculator {
]) ])
const [ balance, pending ] = results const [ balance, pending ] = results
if (!balance) return undefined if (!balance) {
return undefined
}
const pendingValue = pending.reduce((total, tx) => { const pendingValue = pending.reduce((total, tx) => {
return total.add(this.calculateMaxCost(tx)) return total.add(this.calculateMaxCost(tx))

@ -65,7 +65,9 @@ module.exports = class PersonalMessageManager extends EventEmitter {
*/ */
getUnapprovedMsgs () { getUnapprovedMsgs () {
return this.messages.filter(msg => msg.status === 'unapproved') return this.messages.filter(msg => msg.status === 'unapproved')
.reduce((result, msg) => { result[msg.id] = msg; return result }, {}) .reduce((result, msg) => {
result[msg.id] = msg; return result
}, {})
} }
/** /**
@ -110,7 +112,9 @@ module.exports = class PersonalMessageManager extends EventEmitter {
addUnapprovedMessage (msgParams, req) { addUnapprovedMessage (msgParams, req) {
log.debug(`PersonalMessageManager addUnapprovedMessage: ${JSON.stringify(msgParams)}`) log.debug(`PersonalMessageManager addUnapprovedMessage: ${JSON.stringify(msgParams)}`)
// add origin from request // add origin from request
if (req) msgParams.origin = req.origin if (req) {
msgParams.origin = req.origin
}
msgParams.data = this.normalizeMsgData(msgParams.data) msgParams.data = this.normalizeMsgData(msgParams.data)
// create txData obj with parameters and meta data // create txData obj with parameters and meta data
var time = (new Date()).getTime() var time = (new Date()).getTime()
@ -229,7 +233,9 @@ module.exports = class PersonalMessageManager extends EventEmitter {
*/ */
_setMsgStatus (msgId, status) { _setMsgStatus (msgId, status) {
const msg = this.getMsg(msgId) const msg = this.getMsg(msgId)
if (!msg) throw new Error(`PersonalMessageManager - Message not found for id: "${msgId}".`) if (!msg) {
throw new Error(`PersonalMessageManager - Message not found for id: "${msgId}".`)
}
msg.status = status msg.status = status
this._updateMsg(msg) this._updateMsg(msg)
this.emit(`${msgId}:${status}`, msg) this.emit(`${msgId}:${status}`, msg)

@ -7,7 +7,9 @@ module.exports = setupFetchDebugging
// //
function setupFetchDebugging () { function setupFetchDebugging () {
if (!global.fetch) return if (!global.fetch) {
return
}
const originalFetch = global.fetch const originalFetch = global.fetch
global.fetch = wrappedFetch global.fetch = wrappedFetch

@ -22,7 +22,9 @@ function setupMetamaskMeshMetrics () {
function submitMeshMetricsEntry (message) { function submitMeshMetricsEntry (message) {
// ignore if we haven't loaded yet // ignore if we haven't loaded yet
if (!didLoad) return if (!didLoad) {
return
}
// submit the message // submit the message
testingContainer.contentWindow.postMessage(message, targetOrigin) testingContainer.contentWindow.postMessage(message, targetOrigin)
} }

@ -67,11 +67,15 @@ function simplifyErrorMessages (report) {
function rewriteErrorMessages (report, rewriteFn) { function rewriteErrorMessages (report, rewriteFn) {
// rewrite top level message // rewrite top level message
if (typeof report.message === 'string') report.message = rewriteFn(report.message) if (typeof report.message === 'string') {
report.message = rewriteFn(report.message)
}
// rewrite each exception message // rewrite each exception message
if (report.exception && report.exception.values) { if (report.exception && report.exception.values) {
report.exception.values.forEach(item => { report.exception.values.forEach(item => {
if (typeof item.value === 'string') item.value = rewriteFn(item.value) if (typeof item.value === 'string') {
item.value = rewriteFn(item.value)
}
}) })
} }
} }
@ -91,7 +95,9 @@ function rewriteReportUrls (report) {
function toMetamaskUrl (origUrl) { function toMetamaskUrl (origUrl) {
const filePath = origUrl.split(location.origin)[1] const filePath = origUrl.split(location.origin)[1]
if (!filePath) return origUrl if (!filePath) {
return origUrl
}
const metamaskUrl = `metamask${filePath}` const metamaskUrl = `metamask${filePath}`
return metamaskUrl return metamaskUrl
} }

@ -43,7 +43,9 @@ function setupMultiplex (connectionStream) {
mux, mux,
connectionStream, connectionStream,
(err) => { (err) => {
if (err) console.error(err) if (err) {
console.error(err)
}
} }
) )
return mux return mux

@ -58,7 +58,9 @@ module.exports = class TypedMessageManager extends EventEmitter {
*/ */
getUnapprovedMsgs () { getUnapprovedMsgs () {
return this.messages.filter(msg => msg.status === 'unapproved') return this.messages.filter(msg => msg.status === 'unapproved')
.reduce((result, msg) => { result[msg.id] = msg; return result }, {}) .reduce((result, msg) => {
result[msg.id] = msg; return result
}, {})
} }
/** /**
@ -103,7 +105,9 @@ module.exports = class TypedMessageManager extends EventEmitter {
msgParams.version = version msgParams.version = version
this.validateParams(msgParams) this.validateParams(msgParams)
// add origin from request // add origin from request
if (req) msgParams.origin = req.origin if (req) {
msgParams.origin = req.origin
}
log.debug(`TypedMessageManager addUnapprovedMessage: ${JSON.stringify(msgParams)}`) log.debug(`TypedMessageManager addUnapprovedMessage: ${JSON.stringify(msgParams)}`)
// create txData obj with parameters and meta data // create txData obj with parameters and meta data
@ -149,7 +153,9 @@ module.exports = class TypedMessageManager extends EventEmitter {
assert.ok('from' in params, 'Params must include a from field.') assert.ok('from' in params, 'Params must include a from field.')
assert.equal(typeof params.from, 'string', 'From field must be a string.') assert.equal(typeof params.from, 'string', 'From field must be a string.')
assert.equal(typeof params.data, 'string', 'Data must be passed as a valid JSON string.') assert.equal(typeof params.data, 'string', 'Data must be passed as a valid JSON string.')
assert.doesNotThrow(() => { data = JSON.parse(params.data) }, 'Data must be passed as a valid JSON string.') assert.doesNotThrow(() => {
data = JSON.parse(params.data)
}, 'Data must be passed as a valid JSON string.')
const validation = jsonschema.validate(data, sigUtil.TYPED_MESSAGE_SCHEMA) const validation = jsonschema.validate(data, sigUtil.TYPED_MESSAGE_SCHEMA)
assert.ok(data.primaryType in data.types, `Primary type of "${data.primaryType}" has no type definition.`) assert.ok(data.primaryType in data.types, `Primary type of "${data.primaryType}" has no type definition.`)
assert.equal(validation.errors.length, 0, 'Data must conform to EIP-712 schema. See https://git.io/fNtcx.') assert.equal(validation.errors.length, 0, 'Data must conform to EIP-712 schema. See https://git.io/fNtcx.')
@ -278,7 +284,9 @@ module.exports = class TypedMessageManager extends EventEmitter {
*/ */
_setMsgStatus (msgId, status) { _setMsgStatus (msgId, status) {
const msg = this.getMsg(msgId) const msg = this.getMsg(msgId)
if (!msg) throw new Error('TypedMessageManager - Message not found for id: "${msgId}".') if (!msg) {
throw new Error('TypedMessageManager - Message not found for id: "${msgId}".')
}
msg.status = status msg.status = status
this._updateMsg(msg) this._updateMsg(msg)
this.emit(`${msgId}:${status}`, msg) this.emit(`${msgId}:${status}`, msg)

@ -342,7 +342,9 @@ module.exports = class MetamaskController extends EventEmitter {
// Expose no accounts if this origin has not been approved, preventing // Expose no accounts if this origin has not been approved, preventing
// account-requring RPC methods from completing successfully // account-requring RPC methods from completing successfully
const exposeAccounts = this.providerApprovalController.shouldExposeAccounts(origin) const exposeAccounts = this.providerApprovalController.shouldExposeAccounts(origin)
if (origin !== 'metamask' && !exposeAccounts) { return [] } if (origin !== 'metamask' && !exposeAccounts) {
return []
}
const isUnlocked = this.keyringController.memStore.getState().isUnlocked const isUnlocked = this.keyringController.memStore.getState().isUnlocked
const selectedAddress = this.preferencesController.getSelectedAddress() const selectedAddress = this.preferencesController.getSelectedAddress()
// only show address if account is unlocked // only show address if account is unlocked
@ -1404,7 +1406,9 @@ module.exports = class MetamaskController extends EventEmitter {
this.activeControllerConnections-- this.activeControllerConnections--
this.emit('controllerConnectionChanged', this.activeControllerConnections) this.emit('controllerConnectionChanged', this.activeControllerConnections)
// report any error // report any error
if (err) log.error(err) if (err) {
log.error(err)
}
} }
) )
dnode.on('remote', (remote) => { dnode.on('remote', (remote) => {
@ -1442,7 +1446,9 @@ module.exports = class MetamaskController extends EventEmitter {
mid.destroy() mid.destroy()
} }
}) })
if (err) log.error(err) if (err) {
log.error(err)
}
} }
) )
} }
@ -1507,7 +1513,9 @@ module.exports = class MetamaskController extends EventEmitter {
(err) => { (err) => {
configStore.destroy() configStore.destroy()
configStream.destroy() configStream.destroy()
if (err) log.error(err) if (err) {
log.error(err)
}
} }
) )
} }
@ -1527,7 +1535,9 @@ module.exports = class MetamaskController extends EventEmitter {
outStream, outStream,
(err) => { (err) => {
// report any error // report any error
if (err) log.error(err) if (err) {
log.error(err)
}
} }
) )
@ -1676,10 +1686,14 @@ module.exports = class MetamaskController extends EventEmitter {
* @param {string} amount - The amount of ether desired, as a base 10 string. * @param {string} amount - The amount of ether desired, as a base 10 string.
*/ */
buyEth (address, amount) { buyEth (address, amount) {
if (!amount) amount = '5' if (!amount) {
amount = '5'
}
const network = this.networkController.getNetworkState() const network = this.networkController.getNetworkState()
const url = getBuyEthUrl({ network, address, amount }) const url = getBuyEthUrl({ network, address, amount })
if (url) this.platform.openWindow({ url }) if (url) {
this.platform.openWindow({ url })
}
} }
/** /**

@ -9,7 +9,9 @@ module.exports = {
const safeVersionedData = clone(versionedData) const safeVersionedData = clone(versionedData)
safeVersionedData.meta.version = version safeVersionedData.meta.version = version
try { try {
if (safeVersionedData.data.config.provider.type !== 'rpc') return Promise.resolve(safeVersionedData) if (safeVersionedData.data.config.provider.type !== 'rpc') {
return Promise.resolve(safeVersionedData)
}
switch (safeVersionedData.data.config.provider.rpcTarget) { switch (safeVersionedData.data.config.provider.rpcTarget) {
case 'https://testrpc.metamask.io/': case 'https://testrpc.metamask.io/':
safeVersionedData.data.config.provider = { safeVersionedData.data.config.provider = {

@ -32,8 +32,11 @@ function transformState (state) {
if (TransactionController && TransactionController.transactions) { if (TransactionController && TransactionController.transactions) {
const transactions = TransactionController.transactions const transactions = TransactionController.transactions
newState.TransactionController.transactions = transactions.map((txMeta) => { newState.TransactionController.transactions = transactions.map((txMeta) => {
if (!txMeta.err) return txMeta if (!txMeta.err) {
else if (txMeta.err.message === 'Gave up submitting tx.') txMeta.status = 'failed' return txMeta
} else if (txMeta.err.message === 'Gave up submitting tx.') {
txMeta.status = 'failed'
}
return txMeta return txMeta
}) })
} }

@ -33,7 +33,9 @@ function transformState (state) {
const transactions = newState.TransactionController.transactions const transactions = newState.TransactionController.transactions
newState.TransactionController.transactions = transactions.map((txMeta) => { newState.TransactionController.transactions = transactions.map((txMeta) => {
if (!txMeta.err) return txMeta if (!txMeta.err) {
return txMeta
}
if (txMeta.err === 'transaction with the same hash was already imported.') { if (txMeta.err === 'transaction with the same hash was already imported.') {
txMeta.status = 'submitted' txMeta.status = 'submitted'
delete txMeta.err delete txMeta.err

@ -31,7 +31,9 @@ function transformState (state) {
if (TransactionController && TransactionController.transactions) { if (TransactionController && TransactionController.transactions) {
const transactions = newState.TransactionController.transactions const transactions = newState.TransactionController.transactions
newState.TransactionController.transactions = transactions.map((txMeta) => { newState.TransactionController.transactions = transactions.map((txMeta) => {
if (!txMeta.status === 'failed') return txMeta if (!txMeta.status === 'failed') {
return txMeta
}
if (txMeta.retryCount > 0 && txMeta.retryCount < 2) { if (txMeta.retryCount > 0 && txMeta.retryCount < 2) {
txMeta.status = 'submitted' txMeta.status = 'submitted'
delete txMeta.err delete txMeta.err

@ -35,7 +35,9 @@ function transformState (state) {
const transactions = newState.TransactionController.transactions const transactions = newState.TransactionController.transactions
newState.TransactionController.transactions = transactions.map((txMeta, _, txList) => { newState.TransactionController.transactions = transactions.map((txMeta, _, txList) => {
if (txMeta.status !== 'submitted') return txMeta if (txMeta.status !== 'submitted') {
return txMeta
}
const confirmedTxs = txList.filter((tx) => tx.status === 'confirmed') const confirmedTxs = txList.filter((tx) => tx.status === 'confirmed')
.filter((tx) => tx.txParams.from === txMeta.txParams.from) .filter((tx) => tx.txParams.from === txMeta.txParams.from)

@ -33,7 +33,9 @@ function transformState (state) {
const transactions = newState.TransactionController.transactions const transactions = newState.TransactionController.transactions
newState.TransactionController.transactions = transactions.map((txMeta) => { newState.TransactionController.transactions = transactions.map((txMeta) => {
if (txMeta.status !== 'submitted' || txMeta.submittedTime) return txMeta if (txMeta.status !== 'submitted' || txMeta.submittedTime) {
return txMeta
}
txMeta.submittedTime = (new Date()).getTime() txMeta.submittedTime = (new Date()).getTime()
return txMeta return txMeta
}) })

@ -33,7 +33,9 @@ function transformState (state) {
if (TransactionController && TransactionController.transactions) { if (TransactionController && TransactionController.transactions) {
const transactions = newState.TransactionController.transactions const transactions = newState.TransactionController.transactions
if (transactions.length <= 40) return newState if (transactions.length <= 40) {
return newState
}
const reverseTxList = transactions.reverse() const reverseTxList = transactions.reverse()
let stripping = true let stripping = true
@ -44,8 +46,11 @@ function transformState (state) {
txMeta.status === 'confirmed' || txMeta.status === 'confirmed' ||
txMeta.status === 'dropped') txMeta.status === 'dropped')
}) })
if (txIndex < 0) stripping = false if (txIndex < 0) {
else reverseTxList.splice(txIndex, 1) stripping = false
} else {
reverseTxList.splice(txIndex, 1)
}
} }
newState.TransactionController.transactions = reverseTxList.reverse() newState.TransactionController.transactions = reverseTxList.reverse()

@ -25,7 +25,9 @@ module.exports = {
function transformState (state) { function transformState (state) {
const newState = state const newState = state
if (!newState.TransactionController) return newState if (!newState.TransactionController) {
return newState
}
const transactions = newState.TransactionController.transactions const transactions = newState.TransactionController.transactions
newState.TransactionController.transactions = transactions.map((txMeta, _) => { newState.TransactionController.transactions = transactions.map((txMeta, _) => {
if ( if (

@ -29,7 +29,9 @@ function transformState (state) {
if (newState.TransactionController.transactions) { if (newState.TransactionController.transactions) {
const transactions = newState.TransactionController.transactions const transactions = newState.TransactionController.transactions
newState.TransactionController.transactions = transactions.map((txMeta) => { newState.TransactionController.transactions = transactions.map((txMeta) => {
if (txMeta.status !== 'unapproved') return txMeta if (txMeta.status !== 'unapproved') {
return txMeta
}
txMeta.txParams = normalizeTxParams(txMeta.txParams) txMeta.txParams = normalizeTxParams(txMeta.txParams)
return txMeta return txMeta
}) })
@ -54,7 +56,9 @@ function normalizeTxParams (txParams) {
// apply only keys in the whiteList // apply only keys in the whiteList
const normalizedTxParams = {} const normalizedTxParams = {}
Object.keys(whiteList).forEach((key) => { Object.keys(whiteList).forEach((key) => {
if (txParams[key]) normalizedTxParams[key] = whiteList[key](txParams[key]) if (txParams[key]) {
normalizedTxParams[key] = whiteList[key](txParams[key])
}
}) })
return normalizedTxParams return normalizedTxParams

@ -28,7 +28,9 @@ class Mock3Box {
static openBox (address) { static openBox (address) {
this.address = address this.address = address
return Promise.resolve({ return Promise.resolve({
onSyncDone: cb => { setTimeout(cb, 200) }, onSyncDone: cb => {
setTimeout(cb, 200)
},
openSpace: async (spaceName, config) => { openSpace: async (spaceName, config) => {
const { onSyncDone } = config const { onSyncDone } = config
this.spaceName = spaceName this.spaceName = spaceName

@ -5,7 +5,9 @@ const readInstalled = require('read-installed')
const installScripts = ['preinstall', 'install', 'postinstall'] const installScripts = ['preinstall', 'install', 'postinstall']
readInstalled('./', { dev: true }, function (err, data) { readInstalled('./', { dev: true }, function (err, data) {
if (err) throw err if (err) {
throw err
}
const deps = data.dependencies const deps = data.dependencies
Object.entries(deps).forEach(([packageName, packageData]) => { Object.entries(deps).forEach(([packageName, packageData]) => {
@ -13,12 +15,20 @@ readInstalled('./', { dev: true }, function (err, data) {
const scriptKeys = Reflect.ownKeys(packageScripts) const scriptKeys = Reflect.ownKeys(packageScripts)
const hasInstallScript = installScripts.some(installKey => scriptKeys.includes(installKey)) const hasInstallScript = installScripts.some(installKey => scriptKeys.includes(installKey))
if (!hasInstallScript) return if (!hasInstallScript) {
return
}
const matchingScripts = {} const matchingScripts = {}
if (packageScripts.preinstall) matchingScripts.preinstall = packageScripts.preinstall if (packageScripts.preinstall) {
if (packageScripts.install) matchingScripts.install = packageScripts.install matchingScripts.preinstall = packageScripts.preinstall
if (packageScripts.postinstall) matchingScripts.postinstall = packageScripts.postinstall }
if (packageScripts.install) {
matchingScripts.install = packageScripts.install
}
if (packageScripts.postinstall) {
matchingScripts.postinstall = packageScripts.postinstall
}
const scriptNames = Reflect.ownKeys(matchingScripts) const scriptNames = Reflect.ownKeys(matchingScripts)
const relativePath = path.relative(process.cwd(), packageData.path) const relativePath = path.relative(process.cwd(), packageData.path)

@ -52,7 +52,9 @@ async function validateSourcemapForFile ({ buildName }) {
const consumer = await new SourceMapConsumer(rawSourceMap) const consumer = await new SourceMapConsumer(rawSourceMap)
const hasContentsOfAllSources = consumer.hasContentsOfAllSources() const hasContentsOfAllSources = consumer.hasContentsOfAllSources()
if (!hasContentsOfAllSources) console.warn('SourcemapValidator - missing content of some sources...') if (!hasContentsOfAllSources) {
console.warn('SourcemapValidator - missing content of some sources...')
}
console.log(` sampling from ${consumer.sources.length} files`) console.log(` sampling from ${consumer.sources.length} files`)
let sampleCount = 0 let sampleCount = 0
@ -96,6 +98,8 @@ async function validateSourcemapForFile ({ buildName }) {
function indicesOf (substring, string) { function indicesOf (substring, string) {
var a = [] var a = []
var i = -1 var i = -1
while ((i = string.indexOf(substring, i + 1)) >= 0) a.push(i) while ((i = string.indexOf(substring, i + 1)) >= 0) {
a.push(i)
}
return a return a
} }

@ -428,7 +428,9 @@ function createTasksForBuildJs ({ rootDir, taskPrefix, bundleTaskOpts, destinati
// compose into larger task // compose into larger task
const subtasks = [] const subtasks = []
subtasks.push(gulp.parallel(buildPhase1.map(file => `${taskPrefix}:${file}`))) subtasks.push(gulp.parallel(buildPhase1.map(file => `${taskPrefix}:${file}`)))
if (buildPhase2.length) subtasks.push(gulp.parallel(buildPhase2.map(file => `${taskPrefix}:${file}`))) if (buildPhase2.length) {
subtasks.push(gulp.parallel(buildPhase2.map(file => `${taskPrefix}:${file}`)))
}
gulp.task(taskPrefix, gulp.series(subtasks)) gulp.task(taskPrefix, gulp.series(subtasks))
} }

@ -36,8 +36,12 @@ require('jsdom-global')()
window.localStorage = {} window.localStorage = {}
// crypto.getRandomValues // crypto.getRandomValues
if (!window.crypto) window.crypto = {} if (!window.crypto) {
if (!window.crypto.getRandomValues) window.crypto.getRandomValues = require('polyfill-crypto.getrandomvalues') window.crypto = {}
}
if (!window.crypto.getRandomValues) {
window.crypto.getRandomValues = require('polyfill-crypto.getrandomvalues')
}
function enableFailureOnUnhandledPromiseRejection () { function enableFailureOnUnhandledPromiseRejection () {
// overwrite node's promise with the stricter Bluebird promise // overwrite node's promise with the stricter Bluebird promise
@ -60,7 +64,9 @@ function enableFailureOnUnhandledPromiseRejection () {
} else { } else {
var oldOHR = window.onunhandledrejection var oldOHR = window.onunhandledrejection
window.onunhandledrejection = function (evt) { window.onunhandledrejection = function (evt) {
if (typeof oldOHR === 'function') oldOHR.apply(this, arguments) if (typeof oldOHR === 'function') {
oldOHR.apply(this, arguments)
}
throw evt.detail.reason throw evt.detail.reason
} }
} }

@ -19,7 +19,9 @@ pump(
b.bundle(), b.bundle(),
writeStream, writeStream,
(err) => { (err) => {
if (err) throw err if (err) {
throw err
}
console.log(`Integration test build completed: "${bundlePath}"`) console.log(`Integration test build completed: "${bundlePath}"`)
process.exit(0) process.exit(0)
} }

@ -6,7 +6,9 @@ const type = 'Simple Key Pair'
module.exports = class MockSimpleKeychain { module.exports = class MockSimpleKeychain {
static type () { return type } static type () {
return type
}
constructor (opts) { constructor (opts) {
this.type = type this.type = type

@ -15,7 +15,9 @@ async function findAsync (container, selector, opts) {
try { try {
return await pollUntilTruthy(() => { return await pollUntilTruthy(() => {
const result = container.find(selector) const result = container.find(selector)
if (result.length > 0) return result if (result.length > 0) {
return result
}
}, opts) }, opts)
} catch (err) { } catch (err) {
throw new Error(`Failed to find element within interval: "${selector}"`) throw new Error(`Failed to find element within interval: "${selector}"`)
@ -26,7 +28,9 @@ async function queryAsync (jQuery, selector, opts) {
try { try {
return await pollUntilTruthy(() => { return await pollUntilTruthy(() => {
const result = jQuery(selector) const result = jQuery(selector)
if (result.length > 0) return result if (result.length > 0) {
return result
}
}, opts) }, opts)
} catch (err) { } catch (err) {
throw new Error(`Failed to find element within interval: "${selector}"`) throw new Error(`Failed to find element within interval: "${selector}"`)

@ -5,6 +5,10 @@ require('@babel/register')({
require('./helper') require('./helper')
window.SVGPathElement = window.SVGPathElement || { prototype: {} } window.SVGPathElement = window.SVGPathElement || { prototype: {} }
window.fetch = window.fetch || function fetch () { return Promise.resolve() } window.fetch = window.fetch || function fetch () {
return Promise.resolve()
}
global.indexedDB = {} global.indexedDB = {}
global.fetch = global.fetch || function fetch () { return Promise.resolve() } global.fetch = global.fetch || function fetch () {
return Promise.resolve()
}

@ -33,9 +33,15 @@ describe('tx confirmation screen', function () {
describe('cancelTx', function () { describe('cancelTx', function () {
before(function (done) { before(function (done) {
actions._setBackgroundConnection({ actions._setBackgroundConnection({
approveTransaction (_, cb) { cb('An error!') }, approveTransaction (_, cb) {
cancelTransaction (_, cb) { cb() }, cb('An error!')
getState (cb) { cb() }, },
cancelTransaction (_, cb) {
cb()
},
getState (cb) {
cb()
},
}) })
done() done()
}) })

@ -227,7 +227,9 @@ describe('MetaMaskController', function () {
it('should be able to call newVaultAndRestore despite a mistake.', async function () { it('should be able to call newVaultAndRestore despite a mistake.', async function () {
const password = 'what-what-what' const password = 'what-what-what'
sandbox.stub(metamaskController, 'getBalance') sandbox.stub(metamaskController, 'getBalance')
metamaskController.getBalance.callsFake(() => { return Promise.resolve('0x0') }) metamaskController.getBalance.callsFake(() => {
return Promise.resolve('0x0')
})
await metamaskController.createNewVaultAndRestore(password, TEST_SEED.slice(0, -1)).catch(() => null) await metamaskController.createNewVaultAndRestore(password, TEST_SEED.slice(0, -1)).catch(() => null)
await metamaskController.createNewVaultAndRestore(password, TEST_SEED) await metamaskController.createNewVaultAndRestore(password, TEST_SEED)
@ -237,7 +239,9 @@ describe('MetaMaskController', function () {
it('should clear previous identities after vault restoration', async () => { it('should clear previous identities after vault restoration', async () => {
sandbox.stub(metamaskController, 'getBalance') sandbox.stub(metamaskController, 'getBalance')
metamaskController.getBalance.callsFake(() => { return Promise.resolve('0x0') }) metamaskController.getBalance.callsFake(() => {
return Promise.resolve('0x0')
})
await metamaskController.createNewVaultAndRestore('foobar1337', TEST_SEED) await metamaskController.createNewVaultAndRestore('foobar1337', TEST_SEED)
assert.deepEqual(metamaskController.getState().identities, { assert.deepEqual(metamaskController.getState().identities, {
@ -676,7 +680,9 @@ describe('MetaMaskController', function () {
beforeEach(async () => { beforeEach(async () => {
sandbox.stub(metamaskController, 'getBalance') sandbox.stub(metamaskController, 'getBalance')
metamaskController.getBalance.callsFake(() => { return Promise.resolve('0x0') }) metamaskController.getBalance.callsFake(() => {
return Promise.resolve('0x0')
})
await metamaskController.createNewVaultAndRestore('foobar1337', TEST_SEED_ALT) await metamaskController.createNewVaultAndRestore('foobar1337', TEST_SEED_ALT)
@ -734,7 +740,9 @@ describe('MetaMaskController', function () {
beforeEach(async function () { beforeEach(async function () {
sandbox.stub(metamaskController, 'getBalance') sandbox.stub(metamaskController, 'getBalance')
metamaskController.getBalance.callsFake(() => { return Promise.resolve('0x0') }) metamaskController.getBalance.callsFake(() => {
return Promise.resolve('0x0')
})
await metamaskController.createNewVaultAndRestore('foobar1337', TEST_SEED_ALT) await metamaskController.createNewVaultAndRestore('foobar1337', TEST_SEED_ALT)
@ -809,7 +817,9 @@ describe('MetaMaskController', function () {
const { promise, resolve } = deferredPromise() const { promise, resolve } = deferredPromise()
streamTest = createThoughStream((chunk, _, cb) => { streamTest = createThoughStream((chunk, _, cb) => {
if (chunk.name !== 'phishing') return cb() if (chunk.name !== 'phishing') {
return cb()
}
assert.equal(chunk.data.hostname, phishingUrl.hostname) assert.equal(chunk.data.hostname, phishingUrl.hostname)
resolve() resolve()
cb() cb()
@ -929,6 +939,8 @@ describe('MetaMaskController', function () {
function deferredPromise () { function deferredPromise () {
let resolve let resolve
const promise = new Promise(_resolve => { resolve = _resolve }) const promise = new Promise(_resolve => {
resolve = _resolve
})
return { promise, resolve } return { promise, resolve }
} }

@ -19,7 +19,9 @@ describe('#createPendingNonceMiddleware', function () {
it('should fill the result with a the "pending" nonce', (done) => { it('should fill the result with a the "pending" nonce', (done) => {
const req = { method: 'eth_getTransactionCount', params: [address, 'pending'] } const req = { method: 'eth_getTransactionCount', params: [address, 'pending'] }
const res = {} const res = {}
pendingNonceMiddleware(req, res, () => { done(new Error('should not have called next')) }, () => { pendingNonceMiddleware(req, res, () => {
done(new Error('should not have called next'))
}, () => {
assert(res.result === '0x2') assert(res.result === '0x2')
done() done()
}) })
@ -63,7 +65,9 @@ describe('#createPendingTxMiddleware', function () {
returnUndefined = false returnUndefined = false
const req = { method: 'eth_getTransactionByHash', params: [address, 'pending'] } const req = { method: 'eth_getTransactionByHash', params: [address, 'pending'] }
const res = {} const res = {}
pendingTxMiddleware(req, res, () => { done(new Error('should not have called next')) }, () => { pendingTxMiddleware(req, res, () => {
done(new Error('should not have called next'))
}, () => {
/* /*
// uncomment this section for debugging help with non matching keys // uncomment this section for debugging help with non matching keys
const coppy = {...res.result} const coppy = {...res.result}

@ -455,28 +455,44 @@ describe('preferences controller', function () {
}) })
it('should validate ERC20 asset correctly', async function () { it('should validate ERC20 asset correctly', async function () {
const validateSpy = sandbox.spy(preferencesController._validateERC20AssetParams) const validateSpy = sandbox.spy(preferencesController._validateERC20AssetParams)
try { validateSpy({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', symbol: 'ABC', decimals: 0}) } catch (e) {} try {
validateSpy({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', symbol: 'ABC', decimals: 0})
} catch (e) {}
assert.equal(validateSpy.threw(), false, 'correct options object') assert.equal(validateSpy.threw(), false, 'correct options object')
const validateSpyAddress = sandbox.spy(preferencesController._validateERC20AssetParams) const validateSpyAddress = sandbox.spy(preferencesController._validateERC20AssetParams)
try { validateSpyAddress({symbol: 'ABC', decimals: 0}) } catch (e) {} try {
validateSpyAddress({symbol: 'ABC', decimals: 0})
} catch (e) {}
assert.equal(validateSpyAddress.threw(), true, 'options object with no address') assert.equal(validateSpyAddress.threw(), true, 'options object with no address')
const validateSpySymbol = sandbox.spy(preferencesController._validateERC20AssetParams) const validateSpySymbol = sandbox.spy(preferencesController._validateERC20AssetParams)
try { validateSpySymbol({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', decimals: 0}) } catch (e) {} try {
validateSpySymbol({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', decimals: 0})
} catch (e) {}
assert.equal(validateSpySymbol.threw(), true, 'options object with no symbol') assert.equal(validateSpySymbol.threw(), true, 'options object with no symbol')
const validateSpyDecimals = sandbox.spy(preferencesController._validateERC20AssetParams) const validateSpyDecimals = sandbox.spy(preferencesController._validateERC20AssetParams)
try { validateSpyDecimals({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', symbol: 'ABC'}) } catch (e) {} try {
validateSpyDecimals({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', symbol: 'ABC'})
} catch (e) {}
assert.equal(validateSpyDecimals.threw(), true, 'options object with no decimals') assert.equal(validateSpyDecimals.threw(), true, 'options object with no decimals')
const validateSpyInvalidSymbol = sandbox.spy(preferencesController._validateERC20AssetParams) const validateSpyInvalidSymbol = sandbox.spy(preferencesController._validateERC20AssetParams)
try { validateSpyInvalidSymbol({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', symbol: 'ABCDEFGHI', decimals: 0}) } catch (e) {} try {
validateSpyInvalidSymbol({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', symbol: 'ABCDEFGHI', decimals: 0})
} catch (e) {}
assert.equal(validateSpyInvalidSymbol.threw(), true, 'options object with invalid symbol') assert.equal(validateSpyInvalidSymbol.threw(), true, 'options object with invalid symbol')
const validateSpyInvalidDecimals1 = sandbox.spy(preferencesController._validateERC20AssetParams) const validateSpyInvalidDecimals1 = sandbox.spy(preferencesController._validateERC20AssetParams)
try { validateSpyInvalidDecimals1({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', symbol: 'ABCDEFGHI', decimals: -1}) } catch (e) {} try {
validateSpyInvalidDecimals1({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', symbol: 'ABCDEFGHI', decimals: -1})
} catch (e) {}
assert.equal(validateSpyInvalidDecimals1.threw(), true, 'options object with decimals less than zero') assert.equal(validateSpyInvalidDecimals1.threw(), true, 'options object with decimals less than zero')
const validateSpyInvalidDecimals2 = sandbox.spy(preferencesController._validateERC20AssetParams) const validateSpyInvalidDecimals2 = sandbox.spy(preferencesController._validateERC20AssetParams)
try { validateSpyInvalidDecimals2({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', symbol: 'ABCDEFGHI', decimals: 38}) } catch (e) {} try {
validateSpyInvalidDecimals2({rawAddress: '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07', symbol: 'ABCDEFGHI', decimals: 38})
} catch (e) {}
assert.equal(validateSpyInvalidDecimals2.threw(), true, 'options object with decimals more than 36') assert.equal(validateSpyInvalidDecimals2.threw(), true, 'options object with decimals more than 36')
const validateSpyInvalidAddress = sandbox.spy(preferencesController._validateERC20AssetParams) const validateSpyInvalidAddress = sandbox.spy(preferencesController._validateERC20AssetParams)
try { validateSpyInvalidAddress({rawAddress: '0x123', symbol: 'ABC', decimals: 0}) } catch (e) {} try {
validateSpyInvalidAddress({rawAddress: '0x123', symbol: 'ABC', decimals: 0})
} catch (e) {}
assert.equal(validateSpyInvalidAddress.threw(), true, 'options object with address invalid') assert.equal(validateSpyInvalidAddress.threw(), true, 'options object with address invalid')
}) })
}) })

@ -40,13 +40,19 @@ describe('PendingTransactionTracker', function () {
return { releaseLock: () => {} } return { releaseLock: () => {} }
}, },
}, },
getPendingTransactions: () => { return [] }, getPendingTransactions: () => {
getCompletedTransactions: () => { return [] }, return []
},
getCompletedTransactions: () => {
return []
},
publishTransaction: () => {}, publishTransaction: () => {},
confirmTransaction: () => {}, confirmTransaction: () => {},
}) })
pendingTxTracker._getBlock = (blockNumber) => { return {number: blockNumber, transactions: []} } pendingTxTracker._getBlock = (blockNumber) => {
return {number: blockNumber, transactions: []}
}
}) })
describe('_checkPendingTx state management', function () { describe('_checkPendingTx state management', function () {
@ -150,14 +156,18 @@ describe('PendingTransactionTracker', function () {
txMeta2.id = 2 txMeta2.id = 2
txMeta3.id = 3 txMeta3.id = 3
txList = [txMeta, txMeta2, txMeta3].map((tx) => { txList = [txMeta, txMeta2, txMeta3].map((tx) => {
tx.processed = new Promise((resolve) => { tx.resolve = resolve }) tx.processed = new Promise((resolve) => {
tx.resolve = resolve
})
return tx return tx
}) })
}) })
it('should warp all txMeta\'s in #updatePendingTxs', function (done) { it('should warp all txMeta\'s in #updatePendingTxs', function (done) {
pendingTxTracker.getPendingTransactions = () => txList pendingTxTracker.getPendingTransactions = () => txList
pendingTxTracker._checkPendingTx = (tx) => { tx.resolve(tx) } pendingTxTracker._checkPendingTx = (tx) => {
tx.resolve(tx)
}
Promise.all(txList.map((tx) => tx.processed)) Promise.all(txList.map((tx) => tx.processed))
.then(() => done()) .then(() => done())
.catch(done) .catch(done)
@ -171,7 +181,9 @@ describe('PendingTransactionTracker', function () {
beforeEach(function () { beforeEach(function () {
const txMeta2 = txMeta3 = txMeta const txMeta2 = txMeta3 = txMeta
txList = [txMeta, txMeta2, txMeta3].map((tx) => { txList = [txMeta, txMeta2, txMeta3].map((tx) => {
tx.processed = new Promise((resolve) => { tx.resolve = resolve }) tx.processed = new Promise((resolve) => {
tx.resolve = resolve
})
return tx return tx
}) })
}) })
@ -181,7 +193,9 @@ describe('PendingTransactionTracker', function () {
}) })
it('should call #_resubmitTx for all pending tx\'s', function (done) { it('should call #_resubmitTx for all pending tx\'s', function (done) {
pendingTxTracker.getPendingTransactions = () => txList pendingTxTracker.getPendingTransactions = () => txList
pendingTxTracker._resubmitTx = async (tx) => { tx.resolve(tx) } pendingTxTracker._resubmitTx = async (tx) => {
tx.resolve(tx)
}
Promise.all(txList.map((tx) => tx.processed)) Promise.all(txList.map((tx) => tx.processed))
.then(() => done()) .then(() => done())
.catch(done) .catch(done)
@ -225,7 +239,9 @@ describe('PendingTransactionTracker', function () {
}) })
pendingTxTracker.getPendingTransactions = () => txList pendingTxTracker.getPendingTransactions = () => txList
pendingTxTracker._resubmitTx = async () => { throw new TypeError('im some real error') } pendingTxTracker._resubmitTx = async () => {
throw new TypeError('im some real error')
}
Promise.all(txList.map((tx) => tx.processed)) Promise.all(txList.map((tx) => tx.processed))
.then(() => done()) .then(() => done())
.catch(done) .catch(done)
@ -369,7 +385,9 @@ describe('PendingTransactionTracker', function () {
rawTx: '0xf86c808504a817c800827b0d940c62bb85faa3311a998d3aba8098c1235c564966880de0b6b3a7640000802aa08ff665feb887a25d4099e40e11f0fef93ee9608f404bd3f853dd9e84ed3317a6a02ec9d3d1d6e176d4d2593dd760e74ccac753e6a0ea0d00cc9789d0d7ff1f471d', rawTx: '0xf86c808504a817c800827b0d940c62bb85faa3311a998d3aba8098c1235c564966880de0b6b3a7640000802aa08ff665feb887a25d4099e40e11f0fef93ee9608f404bd3f853dd9e84ed3317a6a02ec9d3d1d6e176d4d2593dd760e74ccac753e6a0ea0d00cc9789d0d7ff1f471d',
}] }]
pendingTxTracker.getCompletedTransactions = (address) => { pendingTxTracker.getCompletedTransactions = (address) => {
if (!address) throw new Error('unless behavior has changed #_checkIfNonceIsTaken needs a filtered list of transactions to see if the nonce is taken') if (!address) {
throw new Error('unless behavior has changed #_checkIfNonceIsTaken needs a filtered list of transactions to see if the nonce is taken')
}
return confirmedTxList return confirmedTxList
} }
}) })

@ -38,7 +38,9 @@ describe('Transaction Controller', function () {
blockTrackerStub.getLatestBlock = noop blockTrackerStub.getLatestBlock = noop
txController = new TransactionController({ txController = new TransactionController({
provider, provider,
getGasPrice: function () { return '0xee6b2800' }, getGasPrice: function () {
return '0xee6b2800'
},
networkStore: netStore, networkStore: netStore,
txHistoryLimit: 10, txHistoryLimit: 10,
blockTracker: blockTrackerStub, blockTracker: blockTrackerStub,
@ -162,8 +164,11 @@ describe('Transaction Controller', function () {
txController.newUnapprovedTransaction(txParams) txController.newUnapprovedTransaction(txParams)
.catch((err) => { .catch((err) => {
if (err.message === 'MetaMask Tx Signature: User denied transaction signature.') done() if (err.message === 'MetaMask Tx Signature: User denied transaction signature.') {
else done(err) done()
} else {
done(err)
}
}) })
}) })
}) })
@ -209,8 +214,11 @@ describe('Transaction Controller', function () {
txController.networkStore = new ObservableStore(1) txController.networkStore = new ObservableStore(1)
txController.addUnapprovedTransaction({ from: selectedAddress, to: '0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2' }) txController.addUnapprovedTransaction({ from: selectedAddress, to: '0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2' })
.catch((err) => { .catch((err) => {
if (err.message === 'Recipient is a public account') done() if (err.message === 'Recipient is a public account') {
else done(err) done()
} else {
done(err)
}
}) })
}) })
@ -239,8 +247,11 @@ describe('Transaction Controller', function () {
txController.networkStore = new ObservableStore('loading') txController.networkStore = new ObservableStore('loading')
txController.addUnapprovedTransaction({ from: selectedAddress, to: '0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2' }) txController.addUnapprovedTransaction({ from: selectedAddress, to: '0x0d1d4e623D10F9FBA5Db95830F7d3839406C6AF2' })
.catch((err) => { .catch((err) => {
if (err.message === 'MetaMask is having trouble connecting to the network') done() if (err.message === 'MetaMask is having trouble connecting to the network') {
else done(err) done()
} else {
done(err)
}
}) })
}) })
}) })
@ -403,7 +414,9 @@ describe('Transaction Controller', function () {
assert.equal(status, 'rejected', 'status should e rejected') assert.equal(status, 'rejected', 'status should e rejected')
assert.equal(txId, 0, 'id should e 0') assert.equal(txId, 0, 'id should e 0')
done() done()
} catch (e) { done(e) } } catch (e) {
done(e)
}
}) })
txController.cancelTransaction(0) txController.cancelTransaction(0)
@ -498,7 +511,9 @@ describe('Transaction Controller', function () {
}) })
it('should ignore the error "Transaction Failed: known transaction" and be as usual', async function () { it('should ignore the error "Transaction Failed: known transaction" and be as usual', async function () {
providerResultStub['eth_sendRawTransaction'] = async (_, __, ___, end) => { end('Transaction Failed: known transaction') } providerResultStub['eth_sendRawTransaction'] = async (_, __, ___, end) => {
end('Transaction Failed: known transaction')
}
const rawTx = '0xf86204831e848082520894f231d46dd78806e1dd93442cf33c7671f853874880802ca05f973e540f2d3c2f06d3725a626b75247593cb36477187ae07ecfe0a4db3cf57a00259b52ee8c58baaa385fb05c3f96116e58de89bcc165cb3bfdfc708672fed8a' const rawTx = '0xf86204831e848082520894f231d46dd78806e1dd93442cf33c7671f853874880802ca05f973e540f2d3c2f06d3725a626b75247593cb36477187ae07ecfe0a4db3cf57a00259b52ee8c58baaa385fb05c3f96116e58de89bcc165cb3bfdfc708672fed8a'
txController.txStateManager.addTx(txMeta) txController.txStateManager.addTx(txMeta)
await txController.publishTransaction(txMeta.id, rawTx) await txController.publishTransaction(txMeta.id, rawTx)
@ -617,7 +632,9 @@ describe('Transaction Controller', function () {
_blockTrackerStub.getLatestBlock = noop _blockTrackerStub.getLatestBlock = noop
const _txController = new TransactionController({ const _txController = new TransactionController({
provider: _provider, provider: _provider,
getGasPrice: function () { return '0xee6b2800' }, getGasPrice: function () {
return '0xee6b2800'
},
networkStore: new ObservableStore(currentNetworkId), networkStore: new ObservableStore(currentNetworkId),
txHistoryLimit: 10, txHistoryLimit: 10,
blockTracker: _blockTrackerStub, blockTracker: _blockTrackerStub,
@ -647,7 +664,9 @@ describe('Transaction Controller', function () {
_blockTrackerStub.getLatestBlock = noop _blockTrackerStub.getLatestBlock = noop
const _txController = new TransactionController({ const _txController = new TransactionController({
provider: _provider, provider: _provider,
getGasPrice: function () { return '0xee6b2800' }, getGasPrice: function () {
return '0xee6b2800'
},
networkStore: new ObservableStore(currentNetworkId), networkStore: new ObservableStore(currentNetworkId),
txHistoryLimit: 10, txHistoryLimit: 10,
blockTracker: _blockTrackerStub, blockTracker: _blockTrackerStub,

@ -106,7 +106,9 @@ describe('Transaction state history helper', function () {
assert.equal(result[0].path, expectedEntry1.path) assert.equal(result[0].path, expectedEntry1.path)
assert.equal(result[0].value, expectedEntry1.value) assert.equal(result[0].value, expectedEntry1.value)
assert.equal(result[0].value, expectedEntry1.value) assert.equal(result[0].value, expectedEntry1.value)
if (note) { assert.equal(result[0].note, note) } if (note) {
assert.equal(result[0].note, note)
}
assert.ok(result[0].timestamp >= before && result[0].timestamp <= after) assert.ok(result[0].timestamp >= before && result[0].timestamp <= after)

@ -66,7 +66,9 @@ describe('txUtils', function () {
from: '0x1678a085c290ebd122dc42cba69373b5953b831d', from: '0x1678a085c290ebd122dc42cba69373b5953b831d',
to: '0x', to: '0x',
} }
assert.throws(() => { txUtils.validateRecipient(zeroRecipientTxParams) }, Error, 'Invalid recipient address') assert.throws(() => {
txUtils.validateRecipient(zeroRecipientTxParams)
}, Error, 'Invalid recipient address')
}) })
}) })
@ -76,19 +78,27 @@ describe('txUtils', function () {
// where from is undefined // where from is undefined
const txParams = {} const txParams = {}
assert.throws(() => { txUtils.validateFrom(txParams) }, Error, `Invalid from address ${txParams.from} not a string`) assert.throws(() => {
txUtils.validateFrom(txParams)
}, Error, `Invalid from address ${txParams.from} not a string`)
// where from is array // where from is array
txParams.from = [] txParams.from = []
assert.throws(() => { txUtils.validateFrom(txParams) }, Error, `Invalid from address ${txParams.from} not a string`) assert.throws(() => {
txUtils.validateFrom(txParams)
}, Error, `Invalid from address ${txParams.from} not a string`)
// where from is a object // where from is a object
txParams.from = {} txParams.from = {}
assert.throws(() => { txUtils.validateFrom(txParams) }, Error, `Invalid from address ${txParams.from} not a string`) assert.throws(() => {
txUtils.validateFrom(txParams)
}, Error, `Invalid from address ${txParams.from} not a string`)
// where from is a invalid address // where from is a invalid address
txParams.from = 'im going to fail' txParams.from = 'im going to fail'
assert.throws(() => { txUtils.validateFrom(txParams) }, Error, `Invalid from address`) assert.throws(() => {
txUtils.validateFrom(txParams)
}, Error, `Invalid from address`)
// should run // should run
txParams.from = '0x1678a085c290ebd122dc42cba69373b5953b831d' txParams.from = '0x1678a085c290ebd122dc42cba69373b5953b831d'

@ -33,7 +33,9 @@ describe('nodeify', function () {
}) })
it('no callback - should asyncly throw an error if underlying function does', function (done) { it('no callback - should asyncly throw an error if underlying function does', function (done) {
const nodified = nodeify(async () => { throw new Error('boom!') }, obj) const nodified = nodeify(async () => {
throw new Error('boom!')
}, obj)
process.prependOnceListener('uncaughtException', function (err) { process.prependOnceListener('uncaughtException', function (err) {
assert.ok(err, 'got expected error') assert.ok(err, 'got expected error')
assert.ok(err.message.includes('boom!'), 'got expected error message') assert.ok(err.message.includes('boom!'), 'got expected error message')
@ -50,7 +52,9 @@ describe('nodeify', function () {
const nodified = nodeify(() => 42) const nodified = nodeify(() => 42)
try { try {
nodified((err, result) => { nodified((err, result) => {
if (err) return done(new Error(`should not have thrown any error: ${err.message}`)) if (err) {
return done(new Error(`should not have thrown any error: ${err.message}`))
}
assert.equal(42, result, 'got expected result') assert.equal(42, result, 'got expected result')
}) })
done() done()
@ -60,10 +64,14 @@ describe('nodeify', function () {
}) })
it('sync functions - handles errors', function (done) { it('sync functions - handles errors', function (done) {
const nodified = nodeify(() => { throw new Error('boom!') }) const nodified = nodeify(() => {
throw new Error('boom!')
})
try { try {
nodified((err, result) => { nodified((err, result) => {
if (result) return done(new Error('should not have returned any result')) if (result) {
return done(new Error('should not have returned any result'))
}
assert.ok(err, 'got expected error') assert.ok(err, 'got expected error')
assert.ok(err.message.includes('boom!'), 'got expected error message') assert.ok(err.message.includes('boom!'), 'got expected error message')
}) })

@ -37,7 +37,9 @@ let nonDeletableCount = 0
let status let status
while (transactions.length <= 100) { while (transactions.length <= 100) {
status = txStates[Math.floor(Math.random() * Math.floor(txStates.length - 1))] status = txStates[Math.floor(Math.random() * Math.floor(txStates.length - 1))]
if (!deletableTxStates.find((s) => s === status)) nonDeletableCount++ if (!deletableTxStates.find((s) => s === status)) {
nonDeletableCount++
}
transactions.push({status}) transactions.push({status})
} }

@ -31,8 +31,11 @@ describe('storage is migrated successfully and the txParams.from are lowercase',
.then((migratedData) => { .then((migratedData) => {
const migratedTransactions = migratedData.data.TransactionController.transactions const migratedTransactions = migratedData.data.TransactionController.transactions
migratedTransactions.forEach((tx) => { migratedTransactions.forEach((tx) => {
if (tx.status === 'unapproved') assert.equal(tx.txParams.from, '0x8acce2391c0d510a6c5e5d8f819a678f79b7e675') if (tx.status === 'unapproved') {
else assert.equal(tx.txParams.from, '0x8aCce2391c0d510a6c5E5d8f819a678f79b7e675') assert.equal(tx.txParams.from, '0x8acce2391c0d510a6c5e5d8f819a678f79b7e675')
} else {
assert.equal(tx.txParams.from, '0x8aCce2391c0d510a6c5E5d8f819a678f79b7e675')
}
}) })
done() done()
}).catch(done) }).catch(done)

@ -32,8 +32,12 @@ describe('storage is migrated successfully and the txParams.from are lowercase',
.then((migratedData) => { .then((migratedData) => {
const migratedTransactions = migratedData.data.TransactionController.transactions const migratedTransactions = migratedData.data.TransactionController.transactions
migratedTransactions.forEach((tx) => { migratedTransactions.forEach((tx) => {
if (tx.status === 'unapproved') assert(!tx.txParams.random) if (tx.status === 'unapproved') {
if (tx.status === 'unapproved') assert(!tx.txParams.chainId) assert(!tx.txParams.random)
}
if (tx.status === 'unapproved') {
assert(!tx.txParams.chainId)
}
}) })
done() done()
}).catch(done) }).catch(done)

@ -30,7 +30,9 @@ describe('migration #27', () => {
const newTransactions = newStorage.data.TransactionController.transactions const newTransactions = newStorage.data.TransactionController.transactions
assert.equal(newTransactions.length, 6, 'transactions is expected to have the length of 6') assert.equal(newTransactions.length, 6, 'transactions is expected to have the length of 6')
newTransactions.forEach((txMeta) => { newTransactions.forEach((txMeta) => {
if (txMeta.status === 'rejected') done(new Error('transaction was found with a status of rejected')) if (txMeta.status === 'rejected') {
done(new Error('transaction was found with a status of rejected'))
}
}) })
done() done()
}) })

@ -28,7 +28,9 @@ describe('storage is migrated successfully where transactions that are submitted
assert(txMeta1.err.message.includes('too long'), 'error message assigned') assert(txMeta1.err.message.includes('too long'), 'error message assigned')
txs.forEach((tx) => { txs.forEach((tx) => {
if (tx.id === 1) return if (tx.id === 1) {
return
}
assert.notEqual(tx.status, 'failed', 'other tx is not auto failed') assert.notEqual(tx.status, 'failed', 'other tx is not auto failed')
}) })

@ -58,7 +58,9 @@ describe('Migrator', () => {
it('should emit an error', function (done) { it('should emit an error', function (done) {
this.timeout(15000) this.timeout(15000)
const migrator = new Migrator({ migrations: [{ version: 1, migrate: async () => { throw new Error('test') } } ] }) const migrator = new Migrator({ migrations: [{ version: 1, migrate: async () => {
throw new Error('test')
} } ] })
migrator.on('error', () => done()) migrator.on('error', () => done())
migrator.migrateData({ meta: {version: 0} }) migrator.migrateData({ meta: {version: 0} })
.then(() => { .then(() => {

@ -10,7 +10,9 @@ async function assertRejects (asyncFn, regExp) {
try { try {
await asyncFn() await asyncFn()
} catch (error) { } catch (error) {
f = () => { throw error } f = () => {
throw error
}
} finally { } finally {
assert.throws(f, regExp) assert.throws(f, regExp)
} }

@ -7,7 +7,9 @@ var util = require(path.join(__dirname, '..', '..', 'ui', 'app', 'helpers', 'uti
describe('util', function () { describe('util', function () {
var ethInWei = '1' var ethInWei = '1'
for (var i = 0; i < 18; i++) { ethInWei += '0' } for (var i = 0; i < 18; i++) {
ethInWei += '0'
}
beforeEach(function () { beforeEach(function () {
this.sinon = sinon.createSandbox() this.sinon = sinon.createSandbox()

@ -3,7 +3,9 @@ const Component = require('react').Component
const h = require('react-hyperscript') const h = require('react-hyperscript')
inherits(Menu, Component) inherits(Menu, Component)
function Menu () { Component.call(this) } function Menu () {
Component.call(this)
}
Menu.prototype.render = function () { Menu.prototype.render = function () {
const { className = '', children, isShowing } = this.props const { className = '', children, isShowing } = this.props
@ -13,7 +15,9 @@ Menu.prototype.render = function () {
} }
inherits(Item, Component) inherits(Item, Component)
function Item () { Component.call(this) } function Item () {
Component.call(this)
}
Item.prototype.render = function () { Item.prototype.render = function () {
const { const {
@ -37,14 +41,18 @@ Item.prototype.render = function () {
} }
inherits(Divider, Component) inherits(Divider, Component)
function Divider () { Component.call(this) } function Divider () {
Component.call(this)
}
Divider.prototype.render = function () { Divider.prototype.render = function () {
return h('div.menu__divider') return h('div.menu__divider')
} }
inherits(CloseArea, Component) inherits(CloseArea, Component)
function CloseArea () { Component.call(this) } function CloseArea () {
Component.call(this)
}
CloseArea.prototype.render = function () { CloseArea.prototype.render = function () {
return h('div.menu__close-area', { onClick: this.props.onClick }) return h('div.menu__close-area', { onClick: this.props.onClick })

@ -370,7 +370,9 @@ NetworkDropdown.prototype.renderCustomOption = function (provider) {
const props = this.props const props = this.props
const network = props.network const network = props.network
if (type !== 'rpc') return null if (type !== 'rpc') {
return null
}
switch (rpcTarget) { switch (rpcTarget) {

@ -214,7 +214,9 @@ export function generateChart (gasPrices, estimatedTimes, gasPricesMax, estimate
tick: { tick: {
values: [Math.floor(gasPrices[0]), Math.ceil(gasPricesMax)], values: [Math.floor(gasPrices[0]), Math.ceil(gasPricesMax)],
outer: false, outer: false,
format: function (val) { return val + ' GWEI' }, format: function (val) {
return val + ' GWEI'
},
}, },
padding: {left: gasPricesMax / 50, right: gasPricesMax / 50}, padding: {left: gasPricesMax / 50, right: gasPricesMax / 50},
label: { label: {

@ -28,7 +28,9 @@ function removeLeadingZeroes (str) {
InputNumber.prototype.setValue = function (newValue) { InputNumber.prototype.setValue = function (newValue) {
newValue = removeLeadingZeroes(newValue) newValue = removeLeadingZeroes(newValue)
if (newValue && !isValidInput(newValue)) return if (newValue && !isValidInput(newValue)) {
return
}
const { fixed, min = -1, max = Infinity, onChange } = this.props const { fixed, min = -1, max = Infinity, onChange } = this.props
newValue = fixed ? newValue.toFixed(4) : newValue newValue = fixed ? newValue.toFixed(4) : newValue

@ -105,7 +105,9 @@ TokenList.prototype.createFreshTokenTracker = function () {
this.tracker.removeListener('error', this.showError) this.tracker.removeListener('error', this.showError)
} }
if (!global.ethereumProvider) return if (!global.ethereumProvider) {
return
}
const { userAddress } = this.props const { userAddress } = this.props
this.tracker = new TokenTracker({ this.tracker = new TokenTracker({
@ -154,7 +156,9 @@ TokenList.prototype.componentDidUpdate = function (prevProps) {
const oldTokensLength = tokens ? tokens.length : 0 const oldTokensLength = tokens ? tokens.length : 0
const tokensLengthUnchanged = oldTokensLength === newTokens.length const tokensLengthUnchanged = oldTokensLength === newTokens.length
if (tokensLengthUnchanged && shouldUpdateTokens) return if (tokensLengthUnchanged && shouldUpdateTokens) {
return
}
this.setState({ isLoading: true }) this.setState({ isLoading: true })
this.createFreshTokenTracker() this.createFreshTokenTracker()
@ -168,7 +172,9 @@ TokenList.prototype.updateBalances = function (tokens) {
} }
TokenList.prototype.componentWillUnmount = function () { TokenList.prototype.componentWillUnmount = function () {
if (!this.tracker) return if (!this.tracker) {
return
}
this.tracker.stop() this.tracker.stop()
this.tracker.removeListener('update', this.balanceUpdater) this.tracker.removeListener('update', this.balanceUpdater)
this.tracker.removeListener('error', this.showError) this.tracker.removeListener('error', this.showError)

@ -43,8 +43,12 @@ EthBalanceComponent.prototype.render = function () {
) )
} }
EthBalanceComponent.prototype.renderBalance = function (value) { EthBalanceComponent.prototype.renderBalance = function (value) {
if (value === 'None') return value if (value === 'None') {
if (value === '...') return value return value
}
if (value === '...') {
return value
}
const { const {
conversionRate, conversionRate,

@ -17,7 +17,9 @@ FiatValue.prototype.render = function () {
const value = formatBalance(props.value, 6) const value = formatBalance(props.value, 6)
if (value === 'None') return value if (value === 'None') {
return value
}
var fiatDisplayNumber, fiatTooltipNumber var fiatDisplayNumber, fiatTooltipNumber
var splitBalance = value.split(' ') var splitBalance = value.split(' ')

@ -46,7 +46,9 @@ Mascot.prototype.componentWillUnmount = function () {
Mascot.prototype.handleAnimationEvents = function () { Mascot.prototype.handleAnimationEvents = function () {
// only setup listeners once // only setup listeners once
if (this.animations) return if (this.animations) {
return
}
this.animations = this.props.animationEventEmitter this.animations = this.props.animationEventEmitter
this.animations.on('point', this.lookAt.bind(this)) this.animations.on('point', this.lookAt.bind(this))
this.animations.on('setFollowMouse', this.logo.setFollowMouse.bind(this.logo)) this.animations.on('setFollowMouse', this.logo.setFollowMouse.bind(this.logo))

@ -91,7 +91,9 @@ export default class UnitInput extends PureComponent {
onChange={this.handleChange} onChange={this.handleChange}
onBlur={this.handleBlur} onBlur={this.handleBlur}
style={{ width: this.getInputWidth(value) }} style={{ width: this.getInputWidth(value) }}
ref={ref => { this.unitInput = ref }} ref={ref => {
this.unitInput = ref
}}
disabled={maxModeOn} disabled={maxModeOn}
/> />
{ {

@ -67,7 +67,9 @@ window.getCleanAppState = function () {
window.logStateString = function (cb) { window.logStateString = function (cb) {
const state = window.getCleanAppState() const state = window.getCleanAppState()
global.platform.getPlatformInfo((err, platform) => { global.platform.getPlatformInfo((err, platform) => {
if (err) return cb(err) if (err) {
return cb(err)
}
state.platform = platform state.platform = platform
const stateString = JSON.stringify(state, null, 2) const stateString = JSON.stringify(state, null, 2)
cb(null, stateString) cb(null, stateString)

@ -73,13 +73,19 @@ function isEthNetwork (netId) {
} }
function valuesFor (obj) { function valuesFor (obj) {
if (!obj) return [] if (!obj) {
return []
}
return Object.keys(obj) return Object.keys(obj)
.map(function (key) { return obj[key] }) .map(function (key) {
return obj[key]
})
} }
function addressSummary (address, firstSegLength = 10, lastSegLength = 4, includeHex = true) { function addressSummary (address, firstSegLength = 10, lastSegLength = 4, includeHex = true) {
if (!address) return '' if (!address) {
return ''
}
let checked = checksumAddress(address) let checked = checksumAddress(address)
if (!includeHex) { if (!includeHex) {
checked = ethUtil.stripHexPrefix(checked) checked = ethUtil.stripHexPrefix(checked)
@ -88,14 +94,18 @@ function addressSummary (address, firstSegLength = 10, lastSegLength = 4, includ
} }
function miniAddressSummary (address) { function miniAddressSummary (address) {
if (!address) return '' if (!address) {
return ''
}
var checked = checksumAddress(address) var checked = checksumAddress(address)
return checked ? checked.slice(0, 4) + '...' + checked.slice(-4) : '...' return checked ? checked.slice(0, 4) + '...' + checked.slice(-4) : '...'
} }
function isValidAddress (address) { function isValidAddress (address) {
var prefixed = ethUtil.addHexPrefix(address) var prefixed = ethUtil.addHexPrefix(address)
if (address === '0x0000000000000000000000000000000000000000') return false if (address === '0x0000000000000000000000000000000000000000') {
return false
}
return (isAllOneCase(prefixed) && ethUtil.isValidAddress(prefixed)) || ethUtil.isValidChecksumAddress(prefixed) return (isAllOneCase(prefixed) && ethUtil.isValidAddress(prefixed)) || ethUtil.isValidChecksumAddress(prefixed)
} }
@ -105,12 +115,16 @@ function isValidENSAddress (address) {
function isInvalidChecksumAddress (address) { function isInvalidChecksumAddress (address) {
var prefixed = ethUtil.addHexPrefix(address) var prefixed = ethUtil.addHexPrefix(address)
if (address === '0x0000000000000000000000000000000000000000') return false if (address === '0x0000000000000000000000000000000000000000') {
return false
}
return !isAllOneCase(prefixed) && !ethUtil.isValidChecksumAddress(prefixed) && ethUtil.isValidAddress(prefixed) return !isAllOneCase(prefixed) && !ethUtil.isValidChecksumAddress(prefixed) && ethUtil.isValidAddress(prefixed)
} }
function isAllOneCase (address) { function isAllOneCase (address) {
if (!address) return true if (!address) {
return true
}
var lower = address.toLowerCase() var lower = address.toLowerCase()
var upper = address.toUpperCase() var upper = address.toUpperCase()
return address === lower || address === upper return address === lower || address === upper
@ -118,7 +132,9 @@ function isAllOneCase (address) {
// Takes wei Hex, returns wei BN, even if input is null // Takes wei Hex, returns wei BN, even if input is null
function numericBalance (balance) { function numericBalance (balance) {
if (!balance) return new ethUtil.BN(0, 16) if (!balance) {
return new ethUtil.BN(0, 16)
}
var stripped = ethUtil.stripHexPrefix(balance) var stripped = ethUtil.stripHexPrefix(balance)
return new ethUtil.BN(stripped, 16) return new ethUtil.BN(stripped, 16)
} }
@ -132,7 +148,9 @@ function parseBalance (balance) {
beforeDecimal = weiString.length > 18 ? weiString.slice(0, weiString.length - 18) : '0' beforeDecimal = weiString.length > 18 ? weiString.slice(0, weiString.length - 18) : '0'
afterDecimal = ('000000000000000000' + wei).slice(-18).replace(trailingZeros, '') afterDecimal = ('000000000000000000' + wei).slice(-18).replace(trailingZeros, '')
if (afterDecimal === '') { afterDecimal = '0' } if (afterDecimal === '') {
afterDecimal = '0'
}
return [beforeDecimal, afterDecimal] return [beforeDecimal, afterDecimal]
} }
@ -147,7 +165,9 @@ function formatBalance (balance, decimalsToKeep, needsParse = true, ticker = 'ET
if (beforeDecimal === '0') { if (beforeDecimal === '0') {
if (afterDecimal !== '0') { if (afterDecimal !== '0') {
var sigFigs = afterDecimal.match(/^0*(.{2})/) // default: grabs 2 most significant digits var sigFigs = afterDecimal.match(/^0*(.{2})/) // default: grabs 2 most significant digits
if (sigFigs) { afterDecimal = sigFigs[0] } if (sigFigs) {
afterDecimal = sigFigs[0]
}
formatted = '0.' + afterDecimal + ` ${ticker}` formatted = '0.' + afterDecimal + ` ${ticker}`
} }
} else { } else {

@ -75,7 +75,9 @@ export default class ConfirmTransaction extends Component {
getTokenParams(to) getTokenParams(to)
} }
const txId = transactionId || paramsTransactionId const txId = transactionId || paramsTransactionId
if (txId) this.props.setTransactionToConfirm(txId) if (txId) {
this.props.setTransactionToConfirm(txId)
}
if (trackABTest) { if (trackABTest) {
this.context.metricsEvent({ this.context.metricsEvent({

@ -104,7 +104,9 @@ class ConnectScreen extends Component {
scrollToTutorial = () => { scrollToTutorial = () => {
if (this.referenceNode) this.referenceNode.scrollIntoView({behavior: 'smooth'}) if (this.referenceNode) {
this.referenceNode.scrollIntoView({behavior: 'smooth'})
}
} }
renderLearnMore () { renderLearnMore () {
@ -141,7 +143,9 @@ class ConnectScreen extends Component {
] ]
return h('.hw-tutorial', { return h('.hw-tutorial', {
ref: node => { this.referenceNode = node }, ref: node => {
this.referenceNode = node
},
}, },
steps.map((step) => ( steps.map((step) => (
h('div.hw-connect', {}, [ h('div.hw-connect', {}, [

@ -170,7 +170,9 @@ class MobileSyncPage extends Component {
} }
async startSyncing () { async startSyncing () {
if (this.syncing) return false if (this.syncing) {
return false
}
this.syncing = true this.syncing = true
this.setState({syncing: true}) this.setState({syncing: true})

@ -261,7 +261,9 @@ class Routes extends Component {
if (!this.props.isUnlocked) { if (!this.props.isUnlocked) {
// currently inactive: redirect to password box // currently inactive: redirect to password box
var passwordBox = document.querySelector('input[type=password]') var passwordBox = document.querySelector('input[type=password]')
if (!passwordBox) return if (!passwordBox) {
return
}
passwordBox.focus() passwordBox.focus()
} else { } else {
// currently active: deactivate // currently active: deactivate

@ -86,8 +86,12 @@ export default class EnsInput extends Component {
log.info(`ENS attempting to resolve name: ${recipient}`) log.info(`ENS attempting to resolve name: ${recipient}`)
this.ens.lookup(recipient) this.ens.lookup(recipient)
.then((address) => { .then((address) => {
if (address === ZERO_ADDRESS) throw new Error(this.context.t('noAddressForName')) if (address === ZERO_ADDRESS) {
if (address === ZERO_X_ERROR_ADDRESS) throw new Error(this.context.t('ensRegistrationError')) throw new Error(this.context.t('noAddressForName'))
}
if (address === ZERO_X_ERROR_ADDRESS) {
throw new Error(this.context.t('ensRegistrationError'))
}
this.props.updateEnsResolution(address) this.props.updateEnsResolution(address)
}) })
.catch((reason) => { .catch((reason) => {
@ -232,7 +236,9 @@ export default class EnsInput extends Component {
ensIconContents () { ensIconContents () {
const { loadingEns, ensFailure, ensResolution, toError } = this.state || { ensResolution: ZERO_ADDRESS } const { loadingEns, ensFailure, ensResolution, toError } = this.state || { ensResolution: ZERO_ADDRESS }
if (toError) return if (toError) {
return
}
if (loadingEns) { if (loadingEns) {
return ( return (

@ -304,7 +304,9 @@ export default class SendTransactionScreen extends PersistentForm {
}} }}
onChange={this.onRecipientInputChange} onChange={this.onRecipientInputChange}
onValidAddressTyped={(address) => this.props.updateSendTo(address, '')} onValidAddressTyped={(address) => this.props.updateSendTo(address, '')}
onPaste={text => { this.props.updateSendTo(text) && this.updateGas() }} onPaste={text => {
this.props.updateSendTo(text) && this.updateGas()
}}
onReset={() => this.props.updateSendTo('', '')} onReset={() => this.props.updateSendTo('', '')}
updateEnsResolution={this.props.updateSendEnsResolution} updateEnsResolution={this.props.updateSendEnsResolution}
updateEnsResolutionError={this.props.updateSendEnsResolutionError} updateEnsResolutionError={this.props.updateSendEnsResolutionError}

@ -293,18 +293,24 @@ function addGasBuffer (initialGasLimitHex, blockGasLimitHex, bufferMultiplier =
if (conversionGreaterThan( if (conversionGreaterThan(
{ value: initialGasLimitHex, fromNumericBase: 'hex' }, { value: initialGasLimitHex, fromNumericBase: 'hex' },
{ value: upperGasLimit, fromNumericBase: 'hex' }, { value: upperGasLimit, fromNumericBase: 'hex' },
)) return initialGasLimitHex )) {
return initialGasLimitHex
}
// if bufferedGasLimit is below blockGasLimit, use bufferedGasLimit // if bufferedGasLimit is below blockGasLimit, use bufferedGasLimit
if (conversionLessThan( if (conversionLessThan(
{ value: bufferedGasLimit, fromNumericBase: 'hex' }, { value: bufferedGasLimit, fromNumericBase: 'hex' },
{ value: upperGasLimit, fromNumericBase: 'hex' }, { value: upperGasLimit, fromNumericBase: 'hex' },
)) return bufferedGasLimit )) {
return bufferedGasLimit
}
// otherwise use blockGasLimit // otherwise use blockGasLimit
return upperGasLimit return upperGasLimit
} }
function generateTokenTransferData ({ toAddress = '0x0', amount = '0x0', selectedToken }) { function generateTokenTransferData ({ toAddress = '0x0', amount = '0x0', selectedToken }) {
if (!selectedToken) return if (!selectedToken) {
return
}
return TOKEN_TRANSFER_FUNCTION_SIGNATURE + Array.prototype.map.call( return TOKEN_TRANSFER_FUNCTION_SIGNATURE + Array.prototype.map.call(
abi.rawEncode(['address', 'uint256'], [toAddress, ethUtil.addHexPrefix(amount)]), abi.rawEncode(['address', 'uint256'], [toAddress, ethUtil.addHexPrefix(amount)]),
x => ('00' + x.toString(16)).slice(-2) x => ('00' + x.toString(16)).slice(-2)

@ -18,8 +18,12 @@ const {
const stubs = { const stubs = {
addCurrencies: sinon.stub().callsFake((a, b) => { addCurrencies: sinon.stub().callsFake((a, b) => {
if (String(a).match(/^0x.+/)) a = Number(String(a).slice(2)) if (String(a).match(/^0x.+/)) {
if (String(b).match(/^0x.+/)) b = Number(String(b).slice(2)) a = Number(String(a).slice(2))
}
if (String(b).match(/^0x.+/)) {
b = Number(String(b).slice(2))
}
return a + b return a + b
}), }),
conversionUtil: sinon.stub().callsFake((val) => parseInt(val, 16)), conversionUtil: sinon.stub().callsFake((val) => parseInt(val, 16)),

@ -63,7 +63,9 @@ export default class AddContact extends PureComponent {
return ( return (
<EnsInput <EnsInput
className="send__to-row" className="send__to-row"
scanQrCode={_ => { this.props.scanQrCode() }} scanQrCode={_ => {
this.props.scanQrCode()
}}
onChange={this.dValidate} onChange={this.dValidate}
onPaste={text => this.setState({ ethAddress: text })} onPaste={text => this.setState({ ethAddress: text })}
onReset={() => this.setState({ ethAddress: '', ensAddress: '' })} onReset={() => this.setState({ ethAddress: '', ensAddress: '' })}

@ -675,7 +675,9 @@ function addNewKeyring (type, opts) {
log.debug(`background.addNewKeyring`) log.debug(`background.addNewKeyring`)
background.addNewKeyring(type, opts, (err) => { background.addNewKeyring(type, opts, (err) => {
dispatch(actions.hideLoadingIndication()) dispatch(actions.hideLoadingIndication())
if (err) return dispatch(actions.displayWarning(err.message)) if (err) {
return dispatch(actions.displayWarning(err.message))
}
dispatch(actions.showAccountsPage()) dispatch(actions.showAccountsPage())
}) })
} }
@ -2288,7 +2290,9 @@ function pairUpdate (coin) {
dispatch(actions.hideWarning()) dispatch(actions.hideWarning())
shapeShiftRequest('marketinfo', {pair: `${coin.toLowerCase()}_eth`}, (mktResponse) => { shapeShiftRequest('marketinfo', {pair: `${coin.toLowerCase()}_eth`}, (mktResponse) => {
dispatch(actions.hideSubLoadingIndication()) dispatch(actions.hideSubLoadingIndication())
if (mktResponse.error) return dispatch(actions.displayWarning(mktResponse.error)) if (mktResponse.error) {
return dispatch(actions.displayWarning(mktResponse.error))
}
dispatch({ dispatch({
type: actions.PAIR_UPDATE, type: actions.PAIR_UPDATE,
value: { value: {
@ -2306,7 +2310,9 @@ function shapeShiftSubview () {
shapeShiftRequest('marketinfo', {pair}, (mktResponse) => { shapeShiftRequest('marketinfo', {pair}, (mktResponse) => {
shapeShiftRequest('getcoins', {}, (response) => { shapeShiftRequest('getcoins', {}, (response) => {
dispatch(actions.hideSubLoadingIndication()) dispatch(actions.hideSubLoadingIndication())
if (mktResponse.error) return dispatch(actions.displayWarning(mktResponse.error)) if (mktResponse.error) {
return dispatch(actions.displayWarning(mktResponse.error))
}
dispatch({ dispatch({
type: actions.SHAPESHIFT_SUBVIEW, type: actions.SHAPESHIFT_SUBVIEW,
value: { value: {
@ -2324,7 +2330,9 @@ function coinShiftRquest (data, marketData) {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
shapeShiftRequest('shift', { method: 'POST', data}, (response) => { shapeShiftRequest('shift', { method: 'POST', data}, (response) => {
dispatch(actions.hideLoadingIndication()) dispatch(actions.hideLoadingIndication())
if (response.error) return dispatch(actions.displayWarning(response.error)) if (response.error) {
return dispatch(actions.displayWarning(response.error))
}
var message = ` var message = `
Deposit your ${response.depositType} to the address below:` Deposit your ${response.depositType} to the address below:`
log.debug(`background.createShapeShiftTx`) log.debug(`background.createShapeShiftTx`)
@ -2359,7 +2367,9 @@ function reshowQrCode (data, coin) {
return (dispatch) => { return (dispatch) => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
shapeShiftRequest('marketinfo', {pair: `${coin.toLowerCase()}_eth`}, (mktResponse) => { shapeShiftRequest('marketinfo', {pair: `${coin.toLowerCase()}_eth`}, (mktResponse) => {
if (mktResponse.error) return dispatch(actions.displayWarning(mktResponse.error)) if (mktResponse.error) {
return dispatch(actions.displayWarning(mktResponse.error))
}
var message = [ var message = [
`Deposit your ${coin} to the address below:`, `Deposit your ${coin} to the address below:`,

@ -17,7 +17,9 @@ function launchMetamaskUi (opts, cb) {
actions._setBackgroundConnection(backgroundConnection) actions._setBackgroundConnection(backgroundConnection)
// check if we are unlocked first // check if we are unlocked first
backgroundConnection.getState(function (err, metamaskState) { backgroundConnection.getState(function (err, metamaskState) {
if (err) return cb(err) if (err) {
return cb(err)
}
startApp(metamaskState, backgroundConnection, opts) startApp(metamaskState, backgroundConnection, opts)
.then((store) => { .then((store) => {
cb(null, store) cb(null, store)
@ -27,7 +29,9 @@ function launchMetamaskUi (opts, cb) {
async function startApp (metamaskState, backgroundConnection, opts) { async function startApp (metamaskState, backgroundConnection, opts) {
// parse opts // parse opts
if (!metamaskState.featureFlags) metamaskState.featureFlags = {} if (!metamaskState.featureFlags) {
metamaskState.featureFlags = {}
}
const currentLocaleMessages = metamaskState.currentLocale const currentLocaleMessages = metamaskState.currentLocale
? await fetchLocale(metamaskState.currentLocale) ? await fetchLocale(metamaskState.currentLocale)

Loading…
Cancel
Save