mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Merge pull request #2237 from MetaMask/network-controller-contd
Networking refactor
This commit is contained in:
commit
f57fd717fe
@ -2,11 +2,13 @@ const MAINET_RPC_URL = 'https://mainnet.infura.io/metamask'
|
|||||||
const ROPSTEN_RPC_URL = 'https://ropsten.infura.io/metamask'
|
const ROPSTEN_RPC_URL = 'https://ropsten.infura.io/metamask'
|
||||||
const KOVAN_RPC_URL = 'https://kovan.infura.io/metamask'
|
const KOVAN_RPC_URL = 'https://kovan.infura.io/metamask'
|
||||||
const RINKEBY_RPC_URL = 'https://rinkeby.infura.io/metamask'
|
const RINKEBY_RPC_URL = 'https://rinkeby.infura.io/metamask'
|
||||||
|
const LOCALHOST_RPC_URL = 'http://localhost:8545'
|
||||||
|
|
||||||
global.METAMASK_DEBUG = 'GULP_METAMASK_DEBUG'
|
global.METAMASK_DEBUG = 'GULP_METAMASK_DEBUG'
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
network: {
|
network: {
|
||||||
|
localhost: LOCALHOST_RPC_URL,
|
||||||
mainnet: MAINET_RPC_URL,
|
mainnet: MAINET_RPC_URL,
|
||||||
ropsten: ROPSTEN_RPC_URL,
|
ropsten: ROPSTEN_RPC_URL,
|
||||||
kovan: KOVAN_RPC_URL,
|
kovan: KOVAN_RPC_URL,
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
|
const assert = require('assert')
|
||||||
const EventEmitter = require('events')
|
const EventEmitter = require('events')
|
||||||
const MetaMaskProvider = require('web3-provider-engine/zero.js')
|
const createMetamaskProvider = require('web3-provider-engine/zero.js')
|
||||||
const ObservableStore = require('obs-store')
|
const ObservableStore = require('obs-store')
|
||||||
const ComposedStore = require('obs-store/lib/composed')
|
const ComposedStore = require('obs-store/lib/composed')
|
||||||
const extend = require('xtend')
|
const extend = require('xtend')
|
||||||
@ -9,6 +10,7 @@ const RPC_ADDRESS_LIST = require('../config.js').network
|
|||||||
const DEFAULT_RPC = RPC_ADDRESS_LIST['rinkeby']
|
const DEFAULT_RPC = RPC_ADDRESS_LIST['rinkeby']
|
||||||
|
|
||||||
module.exports = class NetworkController extends EventEmitter {
|
module.exports = class NetworkController extends EventEmitter {
|
||||||
|
|
||||||
constructor (config) {
|
constructor (config) {
|
||||||
super()
|
super()
|
||||||
config.provider.rpcTarget = this.getRpcAddressForType(config.provider.type, config.provider)
|
config.provider.rpcTarget = this.getRpcAddressForType(config.provider.type, config.provider)
|
||||||
@ -18,13 +20,13 @@ module.exports = class NetworkController extends EventEmitter {
|
|||||||
this._proxy = createEventEmitterProxy()
|
this._proxy = createEventEmitterProxy()
|
||||||
|
|
||||||
this.on('networkDidChange', this.lookupNetwork)
|
this.on('networkDidChange', this.lookupNetwork)
|
||||||
this.providerStore.subscribe((state) => this.switchNetwork({ rpcUrl: state.rpcTarget }))
|
this.providerStore.subscribe((state) => this._switchNetwork({ rpcUrl: state.rpcTarget }))
|
||||||
}
|
}
|
||||||
|
|
||||||
initializeProvider (opts, providerContructor = MetaMaskProvider) {
|
initializeProvider (_providerParams) {
|
||||||
this._baseProviderParams = opts
|
this._baseProviderParams = _providerParams
|
||||||
const provider = providerContructor(opts)
|
const rpcUrl = this.getCurrentRpcAddress()
|
||||||
this._setProvider(provider)
|
this._configureStandardProvider({ rpcUrl })
|
||||||
this._proxy.on('block', this._logBlock.bind(this))
|
this._proxy.on('block', this._logBlock.bind(this))
|
||||||
this._proxy.on('error', this.verifyNetwork.bind(this))
|
this._proxy.on('error', this.verifyNetwork.bind(this))
|
||||||
this.ethQuery = new EthQuery(this._proxy)
|
this.ethQuery = new EthQuery(this._proxy)
|
||||||
@ -32,17 +34,8 @@ module.exports = class NetworkController extends EventEmitter {
|
|||||||
return this._proxy
|
return this._proxy
|
||||||
}
|
}
|
||||||
|
|
||||||
switchNetwork (opts) {
|
|
||||||
this.setNetworkState('loading')
|
|
||||||
const providerParams = extend(this._baseProviderParams, opts)
|
|
||||||
this._baseProviderParams = providerParams
|
|
||||||
const provider = MetaMaskProvider(providerParams)
|
|
||||||
this._setProvider(provider)
|
|
||||||
this.emit('networkDidChange')
|
|
||||||
}
|
|
||||||
|
|
||||||
verifyNetwork () {
|
verifyNetwork () {
|
||||||
// Check network when restoring connectivity:
|
// Check network when restoring connectivity:
|
||||||
if (this.isNetworkLoading()) this.lookupNetwork()
|
if (this.isNetworkLoading()) this.lookupNetwork()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,10 +72,13 @@ module.exports = class NetworkController extends EventEmitter {
|
|||||||
return this.getRpcAddressForType(provider.type)
|
return this.getRpcAddressForType(provider.type)
|
||||||
}
|
}
|
||||||
|
|
||||||
setProviderType (type) {
|
async setProviderType (type) {
|
||||||
|
assert(type !== 'rpc', `NetworkController.setProviderType - cannot connect by type "rpc"`)
|
||||||
|
// skip if type already matches
|
||||||
if (type === this.getProviderConfig().type) return
|
if (type === this.getProviderConfig().type) return
|
||||||
const rpcTarget = this.getRpcAddressForType(type)
|
const rpcTarget = this.getRpcAddressForType(type)
|
||||||
this.providerStore.updateState({type, rpcTarget})
|
assert(rpcTarget, `NetworkController - unknown rpc address for type "${type}"`)
|
||||||
|
this.providerStore.updateState({ type, rpcTarget })
|
||||||
}
|
}
|
||||||
|
|
||||||
getProviderConfig () {
|
getProviderConfig () {
|
||||||
@ -94,6 +90,22 @@ module.exports = class NetworkController extends EventEmitter {
|
|||||||
return provider && provider.rpcTarget ? provider.rpcTarget : DEFAULT_RPC
|
return provider && provider.rpcTarget ? provider.rpcTarget : DEFAULT_RPC
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Private
|
||||||
|
//
|
||||||
|
|
||||||
|
_switchNetwork (providerParams) {
|
||||||
|
this.setNetworkState('loading')
|
||||||
|
this._configureStandardProvider(providerParams)
|
||||||
|
this.emit('networkDidChange')
|
||||||
|
}
|
||||||
|
|
||||||
|
_configureStandardProvider(_providerParams) {
|
||||||
|
const providerParams = extend(this._baseProviderParams, _providerParams)
|
||||||
|
const provider = createMetamaskProvider(providerParams)
|
||||||
|
this._setProvider(provider)
|
||||||
|
}
|
||||||
|
|
||||||
_setProvider (provider) {
|
_setProvider (provider) {
|
||||||
// collect old block tracker events
|
// collect old block tracker events
|
||||||
const oldProvider = this._provider
|
const oldProvider = this._provider
|
||||||
|
@ -217,13 +217,11 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
//
|
//
|
||||||
|
|
||||||
initializeProvider () {
|
initializeProvider () {
|
||||||
return this.networkController.initializeProvider({
|
const providerOpts = {
|
||||||
static: {
|
static: {
|
||||||
eth_syncing: false,
|
eth_syncing: false,
|
||||||
web3_clientVersion: `MetaMask/v${version}`,
|
web3_clientVersion: `MetaMask/v${version}`,
|
||||||
},
|
},
|
||||||
// rpc data source
|
|
||||||
rpcUrl: this.networkController.getCurrentRpcAddress(),
|
|
||||||
originHttpHeaderKey: 'X-Metamask-Origin',
|
originHttpHeaderKey: 'X-Metamask-Origin',
|
||||||
// account mgmt
|
// account mgmt
|
||||||
getAccounts: (cb) => {
|
getAccounts: (cb) => {
|
||||||
@ -243,7 +241,9 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
processMessage: this.newUnsignedMessage.bind(this),
|
processMessage: this.newUnsignedMessage.bind(this),
|
||||||
// personal_sign msg signing
|
// personal_sign msg signing
|
||||||
processPersonalMessage: this.newUnsignedPersonalMessage.bind(this),
|
processPersonalMessage: this.newUnsignedPersonalMessage.bind(this),
|
||||||
})
|
}
|
||||||
|
const providerProxy = this.networkController.initializeProvider(providerOpts)
|
||||||
|
return providerProxy
|
||||||
}
|
}
|
||||||
|
|
||||||
initPublicConfigStore () {
|
initPublicConfigStore () {
|
||||||
@ -312,13 +312,14 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
const txController = this.txController
|
const txController = this.txController
|
||||||
const noticeController = this.noticeController
|
const noticeController = this.noticeController
|
||||||
const addressBookController = this.addressBookController
|
const addressBookController = this.addressBookController
|
||||||
|
const networkController = this.networkController
|
||||||
|
|
||||||
return {
|
return {
|
||||||
// etc
|
// etc
|
||||||
getState: (cb) => cb(null, this.getState()),
|
getState: (cb) => cb(null, this.getState()),
|
||||||
setProviderType: this.networkController.setProviderType.bind(this.networkController),
|
|
||||||
setCurrentCurrency: this.setCurrentCurrency.bind(this),
|
setCurrentCurrency: this.setCurrentCurrency.bind(this),
|
||||||
markAccountsFound: this.markAccountsFound.bind(this),
|
markAccountsFound: this.markAccountsFound.bind(this),
|
||||||
|
|
||||||
// coinbase
|
// coinbase
|
||||||
buyEth: this.buyEth.bind(this),
|
buyEth: this.buyEth.bind(this),
|
||||||
// shapeshift
|
// shapeshift
|
||||||
@ -333,12 +334,14 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
// vault management
|
// vault management
|
||||||
submitPassword: this.submitPassword.bind(this),
|
submitPassword: this.submitPassword.bind(this),
|
||||||
|
|
||||||
|
// network management
|
||||||
|
setProviderType: nodeify(networkController.setProviderType, networkController),
|
||||||
|
setCustomRpc: nodeify(this.setCustomRpc, this),
|
||||||
|
|
||||||
// PreferencesController
|
// PreferencesController
|
||||||
setSelectedAddress: nodeify(preferencesController.setSelectedAddress, preferencesController),
|
setSelectedAddress: nodeify(preferencesController.setSelectedAddress, preferencesController),
|
||||||
addToken: nodeify(preferencesController.addToken, preferencesController),
|
addToken: nodeify(preferencesController.addToken, preferencesController),
|
||||||
setCurrentAccountTab: nodeify(preferencesController.setCurrentAccountTab, preferencesController),
|
setCurrentAccountTab: nodeify(preferencesController.setCurrentAccountTab, preferencesController),
|
||||||
setDefaultRpc: nodeify(this.setDefaultRpc, this),
|
|
||||||
setCustomRpc: nodeify(this.setCustomRpc, this),
|
|
||||||
|
|
||||||
// AddressController
|
// AddressController
|
||||||
setAddressBook: nodeify(addressBookController.setAddressBook, addressBookController),
|
setAddressBook: nodeify(addressBookController.setAddressBook, addressBookController),
|
||||||
@ -689,19 +692,13 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
createShapeShiftTx (depositAddress, depositType) {
|
createShapeShiftTx (depositAddress, depositType) {
|
||||||
this.shapeshiftController.createShapeShiftTx(depositAddress, depositType)
|
this.shapeshiftController.createShapeShiftTx(depositAddress, depositType)
|
||||||
}
|
}
|
||||||
// network
|
|
||||||
|
|
||||||
setDefaultRpc () {
|
// network
|
||||||
this.networkController.setRpcTarget('http://localhost:8545')
|
|
||||||
return Promise.resolve('http://localhost:8545')
|
|
||||||
}
|
|
||||||
|
|
||||||
setCustomRpc (rpcTarget, rpcList) {
|
async setCustomRpc (rpcTarget, rpcList) {
|
||||||
this.networkController.setRpcTarget(rpcTarget)
|
this.networkController.setRpcTarget(rpcTarget)
|
||||||
|
await this.preferencesController.updateFrequentRpcList(rpcTarget)
|
||||||
return this.preferencesController.updateFrequentRpcList(rpcTarget)
|
return rpcTarget
|
||||||
.then(() => {
|
|
||||||
return Promise.resolve(rpcTarget)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -119,14 +119,11 @@ var actions = {
|
|||||||
SET_RPC_TARGET: 'SET_RPC_TARGET',
|
SET_RPC_TARGET: 'SET_RPC_TARGET',
|
||||||
SET_DEFAULT_RPC_TARGET: 'SET_DEFAULT_RPC_TARGET',
|
SET_DEFAULT_RPC_TARGET: 'SET_DEFAULT_RPC_TARGET',
|
||||||
SET_PROVIDER_TYPE: 'SET_PROVIDER_TYPE',
|
SET_PROVIDER_TYPE: 'SET_PROVIDER_TYPE',
|
||||||
USE_ETHERSCAN_PROVIDER: 'USE_ETHERSCAN_PROVIDER',
|
|
||||||
useEtherscanProvider: useEtherscanProvider,
|
|
||||||
showConfigPage,
|
showConfigPage,
|
||||||
SHOW_ADD_TOKEN_PAGE: 'SHOW_ADD_TOKEN_PAGE',
|
SHOW_ADD_TOKEN_PAGE: 'SHOW_ADD_TOKEN_PAGE',
|
||||||
showAddTokenPage,
|
showAddTokenPage,
|
||||||
addToken,
|
addToken,
|
||||||
setRpcTarget: setRpcTarget,
|
setRpcTarget: setRpcTarget,
|
||||||
setDefaultRpcTarget: setDefaultRpcTarget,
|
|
||||||
setProviderType: setProviderType,
|
setProviderType: setProviderType,
|
||||||
// loading overlay
|
// loading overlay
|
||||||
SHOW_LOADING: 'SHOW_LOADING_INDICATION',
|
SHOW_LOADING: 'SHOW_LOADING_INDICATION',
|
||||||
@ -706,16 +703,19 @@ function markAccountsFound () {
|
|||||||
// config
|
// config
|
||||||
//
|
//
|
||||||
|
|
||||||
// default rpc target refers to localhost:8545 in this instance.
|
function setProviderType (type) {
|
||||||
function setDefaultRpcTarget () {
|
|
||||||
log.debug(`background.setDefaultRpcTarget`)
|
|
||||||
return (dispatch) => {
|
return (dispatch) => {
|
||||||
background.setDefaultRpc((err, result) => {
|
log.debug(`background.setProviderType`)
|
||||||
|
background.setProviderType(type, (err, result) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
log.error(err)
|
log.error(err)
|
||||||
return dispatch(self.displayWarning('Had a problem changing networks.'))
|
return dispatch(self.displayWarning('Had a problem changing networks!'))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
return {
|
||||||
|
type: actions.SET_PROVIDER_TYPE,
|
||||||
|
value: type,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -744,23 +744,6 @@ function addToAddressBook (recipient, nickname) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setProviderType (type) {
|
|
||||||
log.debug(`background.setProviderType`)
|
|
||||||
background.setProviderType(type)
|
|
||||||
return {
|
|
||||||
type: actions.SET_PROVIDER_TYPE,
|
|
||||||
value: type,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function useEtherscanProvider () {
|
|
||||||
log.debug(`background.useEtherscanProvider`)
|
|
||||||
background.useEtherscanProvider()
|
|
||||||
return {
|
|
||||||
type: actions.USE_ETHERSCAN_PROVIDER,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function showLoadingIndication (message) {
|
function showLoadingIndication (message) {
|
||||||
return {
|
return {
|
||||||
type: actions.SHOW_LOADING,
|
type: actions.SHOW_LOADING,
|
||||||
|
@ -319,7 +319,7 @@ App.prototype.renderNetworkDropdown = function () {
|
|||||||
{
|
{
|
||||||
key: 'default',
|
key: 'default',
|
||||||
closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }),
|
closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }),
|
||||||
onClick: () => props.dispatch(actions.setDefaultRpcTarget()),
|
onClick: () => props.dispatch(actions.setProviderType('localhost')),
|
||||||
style: {
|
style: {
|
||||||
fontSize: '18px',
|
fontSize: '18px',
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user