mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Create a network controller to manage switcing networks an updating the provider
This commit is contained in:
parent
03d454f73b
commit
f87ea49b5a
152
app/scripts/controllers/network.js
Normal file
152
app/scripts/controllers/network.js
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
const EventEmitter = require('events')
|
||||||
|
const MetaMaskProvider = require('web3-provider-engine/zero.js')
|
||||||
|
const ObservableStore = require('obs-store')
|
||||||
|
const extend = require('xtend')
|
||||||
|
const EthQuery = require('eth-query')
|
||||||
|
const MetamaskConfig = require('../config.js')
|
||||||
|
|
||||||
|
const TESTNET_RPC = MetamaskConfig.network.testnet
|
||||||
|
const MAINNET_RPC = MetamaskConfig.network.mainnet
|
||||||
|
const MORDEN_RPC = MetamaskConfig.network.morden
|
||||||
|
const KOVAN_RPC = MetamaskConfig.network.kovan
|
||||||
|
const RINKEBY_RPC = MetamaskConfig.network.rinkeby
|
||||||
|
|
||||||
|
module.exports = class NetworkController extends EventEmitter {
|
||||||
|
constructor (providerOpts) {
|
||||||
|
super()
|
||||||
|
this.networkStore = new ObservableStore({ network: 'loading' })
|
||||||
|
providerOpts.provider.rpcTarget = this.getRpcAddressForType(providerOpts.provider.type)
|
||||||
|
this.providerStore = new ObservableStore(providerOpts)
|
||||||
|
this._claimed = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
getState () {
|
||||||
|
return extend({},
|
||||||
|
this.networkStore.getState(),
|
||||||
|
this.providerStore.getState()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
initializeProvider (opts) {
|
||||||
|
this.providerConfig = opts
|
||||||
|
this.provider = MetaMaskProvider(opts)
|
||||||
|
this.ethQuery = new EthQuery(this.provider)
|
||||||
|
this.lookupNetwork()
|
||||||
|
return Promise.resolve(this.provider)
|
||||||
|
}
|
||||||
|
switchNetwork (providerConfig) {
|
||||||
|
delete this.provider
|
||||||
|
delete this.ethQuery
|
||||||
|
const newConfig = extend(this.providerConfig, providerConfig)
|
||||||
|
this.providerConfig = newConfig
|
||||||
|
this.provider = MetaMaskProvider(newConfig)
|
||||||
|
this.ethQuery = new EthQuery(this.provider)
|
||||||
|
this.emit('networkSwitch', {
|
||||||
|
provider: this.provider,
|
||||||
|
ethQuery: this.ethQuery,
|
||||||
|
}, this.claim.bind(this))
|
||||||
|
}
|
||||||
|
|
||||||
|
subscribe (cb) {
|
||||||
|
this.networkStore.subscribe(cb)
|
||||||
|
this.providerStore.subscribe(cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
verifyNetwork () {
|
||||||
|
// Check network when restoring connectivity:
|
||||||
|
if (this.isNetworkLoading()) this.lookupNetwork()
|
||||||
|
}
|
||||||
|
|
||||||
|
getNetworkState () {
|
||||||
|
return this.networkStore.getState().network
|
||||||
|
}
|
||||||
|
|
||||||
|
setNetworkState (network) {
|
||||||
|
return this.networkStore.updateState({ network })
|
||||||
|
}
|
||||||
|
|
||||||
|
isNetworkLoading () {
|
||||||
|
return this.getNetworkState() === 'loading'
|
||||||
|
}
|
||||||
|
|
||||||
|
lookupNetwork (err) {
|
||||||
|
if (err) this.setNetworkState('loading')
|
||||||
|
|
||||||
|
this.ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
|
||||||
|
if (err) return this.setNetworkState('loading')
|
||||||
|
|
||||||
|
log.info('web3.getNetwork returned ' + network)
|
||||||
|
this.setNetworkState(network)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
setRpcTarget (rpcUrl) {
|
||||||
|
this.providerStore.updateState({
|
||||||
|
provider: {
|
||||||
|
type: 'rpc',
|
||||||
|
rpcTarget: rpcUrl,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getCurrentRpcAddress () {
|
||||||
|
var provider = this.getProvider()
|
||||||
|
if (!provider) return null
|
||||||
|
return this.getRpcAddressForType(provider.type)
|
||||||
|
}
|
||||||
|
|
||||||
|
setProviderType (type) {
|
||||||
|
if (type === this.getProvider().type) return
|
||||||
|
const rpcTarget = this.getRpcAddressForType(type)
|
||||||
|
this.networkStore.updateState({network: 'loading'})
|
||||||
|
this.switchNetwork({
|
||||||
|
rpcUrl: rpcTarget,
|
||||||
|
})
|
||||||
|
this.once('claimed', () => {
|
||||||
|
this.providerStore.updateState({provider: {type, rpcTarget}})
|
||||||
|
console.log('CLAIMED')
|
||||||
|
this.lookupNetwork()
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
useEtherscanProvider () {
|
||||||
|
this.setProviderType('etherscan')
|
||||||
|
}
|
||||||
|
|
||||||
|
getProvider () {
|
||||||
|
return this.providerStore.getState().provider
|
||||||
|
}
|
||||||
|
|
||||||
|
getRpcAddressForType (type) {
|
||||||
|
const provider = this.getProvider()
|
||||||
|
switch (type) {
|
||||||
|
|
||||||
|
case 'mainnet':
|
||||||
|
return MAINNET_RPC
|
||||||
|
|
||||||
|
case 'testnet':
|
||||||
|
return TESTNET_RPC
|
||||||
|
|
||||||
|
case 'morden':
|
||||||
|
return MORDEN_RPC
|
||||||
|
|
||||||
|
case 'kovan':
|
||||||
|
return KOVAN_RPC
|
||||||
|
|
||||||
|
case 'rinkeby':
|
||||||
|
return RINKEBY_RPC
|
||||||
|
|
||||||
|
default:
|
||||||
|
return provider && provider.rpcTarget ? provider.rpcTarget : TESTNET_RPC
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
claim () {
|
||||||
|
this._claimed += 1
|
||||||
|
if (this._claimed === this.listenerCount('networkSwitch')) {
|
||||||
|
this.emit('claimed')
|
||||||
|
this._claimed = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -41,6 +41,12 @@ class KeyringController extends EventEmitter {
|
|||||||
this.getNetwork = opts.getNetwork
|
this.getNetwork = opts.getNetwork
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setEthStore (ethStore) {
|
||||||
|
delete this.ethStore
|
||||||
|
this.ethStore = ethStore
|
||||||
|
return this.setupAccounts()
|
||||||
|
}
|
||||||
|
|
||||||
// Full Update
|
// Full Update
|
||||||
// returns Promise( @object state )
|
// returns Promise( @object state )
|
||||||
//
|
//
|
||||||
|
@ -1,14 +1,6 @@
|
|||||||
const MetamaskConfig = require('../config.js')
|
|
||||||
const ethUtil = require('ethereumjs-util')
|
const ethUtil = require('ethereumjs-util')
|
||||||
const normalize = require('eth-sig-util').normalize
|
const normalize = require('eth-sig-util').normalize
|
||||||
|
|
||||||
const TESTNET_RPC = MetamaskConfig.network.testnet
|
|
||||||
const MAINNET_RPC = MetamaskConfig.network.mainnet
|
|
||||||
const MORDEN_RPC = MetamaskConfig.network.morden
|
|
||||||
const KOVAN_RPC = MetamaskConfig.network.kovan
|
|
||||||
const RINKEBY_RPC = MetamaskConfig.network.rinkeby
|
|
||||||
|
|
||||||
|
|
||||||
/* The config-manager is a convenience object
|
/* The config-manager is a convenience object
|
||||||
* wrapping a pojo-migrator.
|
* wrapping a pojo-migrator.
|
||||||
*
|
*
|
||||||
@ -35,36 +27,6 @@ ConfigManager.prototype.getConfig = function () {
|
|||||||
return data.config
|
return data.config
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigManager.prototype.setRpcTarget = function (rpcUrl) {
|
|
||||||
var config = this.getConfig()
|
|
||||||
config.provider = {
|
|
||||||
type: 'rpc',
|
|
||||||
rpcTarget: rpcUrl,
|
|
||||||
}
|
|
||||||
this.setConfig(config)
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigManager.prototype.setProviderType = function (type) {
|
|
||||||
var config = this.getConfig()
|
|
||||||
config.provider = {
|
|
||||||
type: type,
|
|
||||||
}
|
|
||||||
this.setConfig(config)
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigManager.prototype.useEtherscanProvider = function () {
|
|
||||||
var config = this.getConfig()
|
|
||||||
config.provider = {
|
|
||||||
type: 'etherscan',
|
|
||||||
}
|
|
||||||
this.setConfig(config)
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigManager.prototype.getProvider = function () {
|
|
||||||
var config = this.getConfig()
|
|
||||||
return config.provider
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigManager.prototype.setData = function (data) {
|
ConfigManager.prototype.setData = function (data) {
|
||||||
this.store.putState(data)
|
this.store.putState(data)
|
||||||
}
|
}
|
||||||
@ -139,35 +101,6 @@ ConfigManager.prototype.getSeedWords = function () {
|
|||||||
return data.seedWords
|
return data.seedWords
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigManager.prototype.getCurrentRpcAddress = function () {
|
|
||||||
var provider = this.getProvider()
|
|
||||||
if (!provider) return null
|
|
||||||
switch (provider.type) {
|
|
||||||
|
|
||||||
case 'mainnet':
|
|
||||||
return MAINNET_RPC
|
|
||||||
|
|
||||||
case 'testnet':
|
|
||||||
return TESTNET_RPC
|
|
||||||
|
|
||||||
case 'morden':
|
|
||||||
return MORDEN_RPC
|
|
||||||
|
|
||||||
case 'kovan':
|
|
||||||
return KOVAN_RPC
|
|
||||||
|
|
||||||
case 'rinkeby':
|
|
||||||
return RINKEBY_RPC
|
|
||||||
|
|
||||||
default:
|
|
||||||
return provider && provider.rpcTarget ? provider.rpcTarget : TESTNET_RPC
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Tx
|
|
||||||
//
|
|
||||||
|
|
||||||
ConfigManager.prototype.getTxList = function () {
|
ConfigManager.prototype.getTxList = function () {
|
||||||
var data = this.getData()
|
var data = this.getData()
|
||||||
if (data.transactions !== undefined) {
|
if (data.transactions !== undefined) {
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
const async = require('async')
|
const async = require('async')
|
||||||
const EthQuery = require('eth-query')
|
|
||||||
const ethUtil = require('ethereumjs-util')
|
const ethUtil = require('ethereumjs-util')
|
||||||
const Transaction = require('ethereumjs-tx')
|
const Transaction = require('ethereumjs-tx')
|
||||||
const normalize = require('eth-sig-util').normalize
|
const normalize = require('eth-sig-util').normalize
|
||||||
@ -7,15 +6,14 @@ const BN = ethUtil.BN
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
tx-utils are utility methods for Transaction manager
|
tx-utils are utility methods for Transaction manager
|
||||||
its passed a provider and that is passed to ethquery
|
its passed ethquery
|
||||||
and used to do things like calculate gas of a tx.
|
and used to do things like calculate gas of a tx.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
module.exports = class txProviderUtils {
|
module.exports = class txProviderUtils {
|
||||||
|
|
||||||
constructor (provider) {
|
constructor (ethQuery) {
|
||||||
this.provider = provider
|
this.query = ethQuery
|
||||||
this.query = new EthQuery(provider)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
analyzeGasUsage (txMeta, cb) {
|
analyzeGasUsage (txMeta, cb) {
|
||||||
|
@ -7,9 +7,9 @@ const ObservableStore = require('obs-store')
|
|||||||
const EthStore = require('./lib/eth-store')
|
const EthStore = require('./lib/eth-store')
|
||||||
const EthQuery = require('eth-query')
|
const EthQuery = require('eth-query')
|
||||||
const streamIntoProvider = require('web3-stream-provider/handler')
|
const streamIntoProvider = require('web3-stream-provider/handler')
|
||||||
const MetaMaskProvider = require('web3-provider-engine/zero.js')
|
|
||||||
const setupMultiplex = require('./lib/stream-utils.js').setupMultiplex
|
const setupMultiplex = require('./lib/stream-utils.js').setupMultiplex
|
||||||
const KeyringController = require('./keyring-controller')
|
const KeyringController = require('./keyring-controller')
|
||||||
|
const NetworkController = require('./controllers/network')
|
||||||
const PreferencesController = require('./controllers/preferences')
|
const PreferencesController = require('./controllers/preferences')
|
||||||
const CurrencyController = require('./controllers/currency')
|
const CurrencyController = require('./controllers/currency')
|
||||||
const NoticeController = require('./notice-controller')
|
const NoticeController = require('./notice-controller')
|
||||||
@ -40,8 +40,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
this.store = new ObservableStore(initState)
|
this.store = new ObservableStore(initState)
|
||||||
|
|
||||||
// network store
|
// network store
|
||||||
this.networkStore = new ObservableStore({ network: 'loading' })
|
this.networkController = new NetworkController(initState.NetworkController)
|
||||||
|
|
||||||
// config manager
|
// config manager
|
||||||
this.configManager = new ConfigManager({
|
this.configManager = new ConfigManager({
|
||||||
store: this.store,
|
store: this.store,
|
||||||
@ -62,7 +61,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
// rpc provider
|
// rpc provider
|
||||||
this.provider = this.initializeProvider()
|
this.provider = this.initializeProvider()
|
||||||
this.provider.on('block', this.logBlock.bind(this))
|
this.provider.on('block', this.logBlock.bind(this))
|
||||||
this.provider.on('error', this.verifyNetwork.bind(this))
|
this.provider.on('error', this.networkController.verifyNetwork.bind(this.networkController))
|
||||||
|
|
||||||
// eth data query tools
|
// eth data query tools
|
||||||
this.ethQuery = new EthQuery(this.provider)
|
this.ethQuery = new EthQuery(this.provider)
|
||||||
@ -75,7 +74,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
this.keyringController = new KeyringController({
|
this.keyringController = new KeyringController({
|
||||||
initState: initState.KeyringController,
|
initState: initState.KeyringController,
|
||||||
ethStore: this.ethStore,
|
ethStore: this.ethStore,
|
||||||
getNetwork: this.getNetworkState.bind(this),
|
getNetwork: this.networkController.getNetworkState.bind(this.networkController),
|
||||||
})
|
})
|
||||||
this.keyringController.on('newAccount', (address) => {
|
this.keyringController.on('newAccount', (address) => {
|
||||||
this.preferencesController.setSelectedAddress(address)
|
this.preferencesController.setSelectedAddress(address)
|
||||||
@ -92,10 +91,10 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
// tx mgmt
|
// tx mgmt
|
||||||
this.txManager = new TxManager({
|
this.txManager = new TxManager({
|
||||||
initState: initState.TransactionManager,
|
initState: initState.TransactionManager,
|
||||||
networkStore: this.networkStore,
|
networkStore: this.networkController.networkStore,
|
||||||
preferencesStore: this.preferencesController.store,
|
preferencesStore: this.preferencesController.store,
|
||||||
txHistoryLimit: 40,
|
txHistoryLimit: 40,
|
||||||
getNetwork: this.getNetworkState.bind(this),
|
getNetwork: this.networkController.getNetworkState.bind(this),
|
||||||
signTransaction: this.keyringController.signTransaction.bind(this.keyringController),
|
signTransaction: this.keyringController.signTransaction.bind(this.keyringController),
|
||||||
provider: this.provider,
|
provider: this.provider,
|
||||||
blockTracker: this.provider,
|
blockTracker: this.provider,
|
||||||
@ -112,8 +111,34 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
this.shapeshiftController = new ShapeShiftController({
|
this.shapeshiftController = new ShapeShiftController({
|
||||||
initState: initState.ShapeShiftController,
|
initState: initState.ShapeShiftController,
|
||||||
})
|
})
|
||||||
|
this.networkController.on('networkSwitch', (providerUtil, claimed) => {
|
||||||
|
delete this.provider
|
||||||
|
delete this.ethQuery
|
||||||
|
delete this.ethStore
|
||||||
|
console.log('order:@? 1')
|
||||||
|
this.provider = providerUtil.provider
|
||||||
|
this.provider.on('block', this.logBlock.bind(this))
|
||||||
|
this.provider.on('error', this.networkController.verifyNetwork.bind(this.networkController))
|
||||||
|
|
||||||
this.lookupNetwork()
|
this.ethQuery = providerUtil.ethQuery
|
||||||
|
this.ethStore = new EthStore({
|
||||||
|
provider: this.provider,
|
||||||
|
blockTracker: this.provider,
|
||||||
|
})
|
||||||
|
this.provider.once('block', claimed)
|
||||||
|
})
|
||||||
|
this.networkController.on('networkSwitch', (_, claimed) => {
|
||||||
|
console.log('order:@? 2')
|
||||||
|
this.txManager.setupProviderAndEthQuery({
|
||||||
|
provider: this.provider,
|
||||||
|
blockTracker: this.provider,
|
||||||
|
ethQuery: this.ethQuery,
|
||||||
|
})
|
||||||
|
this.keyringController.setEthStore(this.ethStore)
|
||||||
|
.then(claimed)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.networkController.lookupNetwork()
|
||||||
this.messageManager = new MessageManager()
|
this.messageManager = new MessageManager()
|
||||||
this.personalMessageManager = new PersonalMessageManager()
|
this.personalMessageManager = new PersonalMessageManager()
|
||||||
this.publicConfigStore = this.initPublicConfigStore()
|
this.publicConfigStore = this.initPublicConfigStore()
|
||||||
@ -140,9 +165,12 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
this.shapeshiftController.store.subscribe((state) => {
|
this.shapeshiftController.store.subscribe((state) => {
|
||||||
this.store.updateState({ ShapeShiftController: state })
|
this.store.updateState({ ShapeShiftController: state })
|
||||||
})
|
})
|
||||||
|
this.networkController.providerStore.subscribe((state) => {
|
||||||
|
this.store.updateState({ NetworkController: state })
|
||||||
|
})
|
||||||
|
|
||||||
// manual mem state subscriptions
|
// manual mem state subscriptions
|
||||||
this.networkStore.subscribe(this.sendUpdate.bind(this))
|
this.networkController.subscribe(this.sendUpdate.bind(this))
|
||||||
this.ethStore.subscribe(this.sendUpdate.bind(this))
|
this.ethStore.subscribe(this.sendUpdate.bind(this))
|
||||||
this.txManager.memStore.subscribe(this.sendUpdate.bind(this))
|
this.txManager.memStore.subscribe(this.sendUpdate.bind(this))
|
||||||
this.messageManager.memStore.subscribe(this.sendUpdate.bind(this))
|
this.messageManager.memStore.subscribe(this.sendUpdate.bind(this))
|
||||||
@ -160,12 +188,12 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
//
|
//
|
||||||
|
|
||||||
initializeProvider () {
|
initializeProvider () {
|
||||||
const provider = MetaMaskProvider({
|
this.networkController.initializeProvider({
|
||||||
static: {
|
static: {
|
||||||
eth_syncing: false,
|
eth_syncing: false,
|
||||||
web3_clientVersion: `MetaMask/v${version}`,
|
web3_clientVersion: `MetaMask/v${version}`,
|
||||||
},
|
},
|
||||||
rpcUrl: this.configManager.getCurrentRpcAddress(),
|
rpcUrl: this.networkController.getCurrentRpcAddress(),
|
||||||
// account mgmt
|
// account mgmt
|
||||||
getAccounts: (cb) => {
|
getAccounts: (cb) => {
|
||||||
const isUnlocked = this.keyringController.memStore.getState().isUnlocked
|
const isUnlocked = this.keyringController.memStore.getState().isUnlocked
|
||||||
@ -185,7 +213,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
// new style msg signing
|
// new style msg signing
|
||||||
processPersonalMessage: this.newUnsignedPersonalMessage.bind(this),
|
processPersonalMessage: this.newUnsignedPersonalMessage.bind(this),
|
||||||
})
|
})
|
||||||
return provider
|
return this.networkController.provider
|
||||||
}
|
}
|
||||||
|
|
||||||
initPublicConfigStore () {
|
initPublicConfigStore () {
|
||||||
@ -221,7 +249,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
{
|
{
|
||||||
isInitialized,
|
isInitialized,
|
||||||
},
|
},
|
||||||
this.networkStore.getState(),
|
this.networkController.getState(),
|
||||||
this.ethStore.getState(),
|
this.ethStore.getState(),
|
||||||
this.txManager.memStore.getState(),
|
this.txManager.memStore.getState(),
|
||||||
this.messageManager.memStore.getState(),
|
this.messageManager.memStore.getState(),
|
||||||
@ -255,8 +283,8 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
return {
|
return {
|
||||||
// etc
|
// etc
|
||||||
getState: (cb) => cb(null, this.getState()),
|
getState: (cb) => cb(null, this.getState()),
|
||||||
setProviderType: this.setProviderType.bind(this),
|
setProviderType: this.networkController.setProviderType.bind(this.networkController),
|
||||||
useEtherscanProvider: this.useEtherscanProvider.bind(this),
|
useEtherscanProvider: this.networkController.useEtherscanProvider.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
|
||||||
@ -592,7 +620,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
// Log blocks
|
// Log blocks
|
||||||
logBlock (block) {
|
logBlock (block) {
|
||||||
log.info(`BLOCK CHANGED: #${block.number.toString('hex')} 0x${block.hash.toString('hex')}`)
|
log.info(`BLOCK CHANGED: #${block.number.toString('hex')} 0x${block.hash.toString('hex')}`)
|
||||||
this.verifyNetwork()
|
this.networkController.verifyNetwork()
|
||||||
}
|
}
|
||||||
|
|
||||||
setCurrentCurrency (currencyCode, cb) {
|
setCurrentCurrency (currencyCode, cb) {
|
||||||
@ -612,7 +640,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
|
|
||||||
buyEth (address, amount) {
|
buyEth (address, amount) {
|
||||||
if (!amount) amount = '5'
|
if (!amount) amount = '5'
|
||||||
const network = this.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 })
|
||||||
}
|
}
|
||||||
@ -620,69 +648,21 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
createShapeShiftTx (depositAddress, depositType) {
|
createShapeShiftTx (depositAddress, depositType) {
|
||||||
this.shapeshiftController.createShapeShiftTx(depositAddress, depositType)
|
this.shapeshiftController.createShapeShiftTx(depositAddress, depositType)
|
||||||
}
|
}
|
||||||
|
// network
|
||||||
//
|
|
||||||
// network
|
|
||||||
//
|
|
||||||
|
|
||||||
verifyNetwork () {
|
|
||||||
// Check network when restoring connectivity:
|
|
||||||
if (this.isNetworkLoading()) this.lookupNetwork()
|
|
||||||
}
|
|
||||||
|
|
||||||
setDefaultRpc () {
|
setDefaultRpc () {
|
||||||
this.configManager.setRpcTarget('http://localhost:8545')
|
this.networkController.setRpcTarget('http://localhost:8545')
|
||||||
this.platform.reload()
|
|
||||||
this.lookupNetwork()
|
|
||||||
return Promise.resolve('http://localhost:8545')
|
return Promise.resolve('http://localhost:8545')
|
||||||
}
|
}
|
||||||
|
|
||||||
setCustomRpc (rpcTarget, rpcList) {
|
setCustomRpc (rpcTarget, rpcList) {
|
||||||
this.configManager.setRpcTarget(rpcTarget)
|
this.networkController.setRpcTarget(rpcTarget)
|
||||||
|
|
||||||
return this.preferencesController.updateFrequentRpcList(rpcTarget)
|
return this.preferencesController.updateFrequentRpcList(rpcTarget)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.platform.reload()
|
return Promise.resolve(rpcTarget)
|
||||||
this.lookupNetwork()
|
|
||||||
return Promise.resolve(rpcTarget)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
setProviderType (type) {
|
|
||||||
this.configManager.setProviderType(type)
|
|
||||||
this.platform.reload()
|
|
||||||
this.lookupNetwork()
|
|
||||||
}
|
|
||||||
|
|
||||||
useEtherscanProvider () {
|
|
||||||
this.configManager.useEtherscanProvider()
|
|
||||||
this.platform.reload()
|
|
||||||
}
|
|
||||||
|
|
||||||
getNetworkState () {
|
|
||||||
return this.networkStore.getState().network
|
|
||||||
}
|
|
||||||
|
|
||||||
setNetworkState (network) {
|
|
||||||
return this.networkStore.updateState({ network })
|
|
||||||
}
|
|
||||||
|
|
||||||
isNetworkLoading () {
|
|
||||||
return this.getNetworkState() === 'loading'
|
|
||||||
}
|
|
||||||
|
|
||||||
lookupNetwork (err) {
|
|
||||||
if (err) {
|
|
||||||
this.setNetworkState('loading')
|
|
||||||
}
|
|
||||||
|
|
||||||
this.ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
|
|
||||||
if (err) {
|
|
||||||
this.setNetworkState('loading')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.info('web3.getNetwork returned ' + network)
|
|
||||||
this.setNetworkState(network)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ const extend = require('xtend')
|
|||||||
const Semaphore = require('semaphore')
|
const Semaphore = require('semaphore')
|
||||||
const ObservableStore = require('obs-store')
|
const ObservableStore = require('obs-store')
|
||||||
const ethUtil = require('ethereumjs-util')
|
const ethUtil = require('ethereumjs-util')
|
||||||
const EthQuery = require('eth-query')
|
|
||||||
const TxProviderUtil = require('./lib/tx-utils')
|
const TxProviderUtil = require('./lib/tx-utils')
|
||||||
const createId = require('./lib/random-id')
|
const createId = require('./lib/random-id')
|
||||||
|
|
||||||
@ -18,11 +17,11 @@ module.exports = class TransactionManager extends EventEmitter {
|
|||||||
this.networkStore = opts.networkStore || new ObservableStore({})
|
this.networkStore = opts.networkStore || new ObservableStore({})
|
||||||
this.preferencesStore = opts.preferencesStore || new ObservableStore({})
|
this.preferencesStore = opts.preferencesStore || new ObservableStore({})
|
||||||
this.txHistoryLimit = opts.txHistoryLimit
|
this.txHistoryLimit = opts.txHistoryLimit
|
||||||
this.provider = opts.provider
|
this.setupProviderAndEthQuery({
|
||||||
this.blockTracker = opts.blockTracker
|
provider: opts.provider,
|
||||||
this.query = new EthQuery(this.provider)
|
blockTracker: opts.blockTracker,
|
||||||
this.txProviderUtils = new TxProviderUtil(this.provider)
|
ethQuery: opts.ethQuery,
|
||||||
this.blockTracker.on('block', this.checkForTxInBlock.bind(this))
|
})
|
||||||
this.signEthTx = opts.signTransaction
|
this.signEthTx = opts.signTransaction
|
||||||
this.nonceLock = Semaphore(1)
|
this.nonceLock = Semaphore(1)
|
||||||
|
|
||||||
@ -41,6 +40,20 @@ module.exports = class TransactionManager extends EventEmitter {
|
|||||||
return this.networkStore.getState().network
|
return this.networkStore.getState().network
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setupProviderAndEthQuery ({provider, blockTracker, ethQuery}) {
|
||||||
|
if (this.provider) {
|
||||||
|
delete this.provider
|
||||||
|
delete this.blockTracker
|
||||||
|
delete this.query
|
||||||
|
delete this.txProviderUtils
|
||||||
|
}
|
||||||
|
this.provider = provider
|
||||||
|
this.query = ethQuery
|
||||||
|
this.txProviderUtils = new TxProviderUtil(ethQuery)
|
||||||
|
blockTracker ? this.blockTracker = blockTracker : this.blockTracker = provider
|
||||||
|
this.blockTracker.on('block', this.checkForTxInBlock.bind(this))
|
||||||
|
}
|
||||||
|
|
||||||
getSelectedAddress () {
|
getSelectedAddress () {
|
||||||
return this.preferencesStore.getState().selectedAddress
|
return this.preferencesStore.getState().selectedAddress
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user