diff --git a/app/scripts/controllers/network/network.js b/app/scripts/controllers/network/network.js index 1a251bce1..2958ba3b0 100644 --- a/app/scripts/controllers/network/network.js +++ b/app/scripts/controllers/network/network.js @@ -158,7 +158,7 @@ module.exports = class NetworkController extends EventEmitter { _switchNetwork (opts) { this.setNetworkState('loading') this._configureProvider(opts) - this.emit('networkDidChange') + this.emit('networkDidChange', opts.type) } _configureProvider (opts) { diff --git a/app/scripts/controllers/recent-blocks.js b/app/scripts/controllers/recent-blocks.js index d270f6f44..982ad2aa4 100644 --- a/app/scripts/controllers/recent-blocks.js +++ b/app/scripts/controllers/recent-blocks.js @@ -3,6 +3,14 @@ const extend = require('xtend') const EthQuery = require('eth-query') const log = require('loglevel') const pify = require('pify') +const { + ROPSTEN, + RINKEBY, + KOVAN, + MAINNET, +} = require('./network/enums') +const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET] + class RecentBlocksController { @@ -24,7 +32,7 @@ class RecentBlocksController { * */ constructor (opts = {}) { - const { blockTracker, provider } = opts + const { blockTracker, provider, networkController } = opts this.blockTracker = blockTracker this.ethQuery = new EthQuery(provider) this.historyLength = opts.historyLength || 40 @@ -33,13 +41,30 @@ class RecentBlocksController { recentBlocks: [], }, opts.initState) this.store = new ObservableStore(initState) - - this.blockTracker.on('latest', async (newBlockNumberHex) => { + const blockListner = async (newBlockNumberHex) => { try { await this.processBlock(newBlockNumberHex) } catch (err) { log.error(err) } + } + let isListening = false + const { type } = networkController.getProviderConfig() + if (!INFURA_PROVIDER_TYPES.includes(type) && type !== 'loading') { + this.blockTracker.on('latest', blockListner) + isListening = true + } + networkController.on('networkDidChange', (newType) => { + if (INFURA_PROVIDER_TYPES.includes(newType) && isListening) { + this.blockTracker.removeListener('latest', blockListner) + } else if ( + !INFURA_PROVIDER_TYPES.includes(type) && + type !== 'loading' && + !isListening + ) { + this.blockTracker.on('latest', blockListner) + + } }) this.backfill() } diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 16ab34c7d..622eb78af 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -126,6 +126,7 @@ module.exports = class MetamaskController extends EventEmitter { this.recentBlocksController = new RecentBlocksController({ blockTracker: this.blockTracker, provider: this.provider, + networkController: this.networkController, }) // account tracker watches balances, nonces, and any code at their address.