commit
f552346103
|
@ -2,6 +2,11 @@
|
|||
|
||||
## Current Master
|
||||
|
||||
## 4.11.9 Thu Aug 22 2019
|
||||
|
||||
- [#303](https://github.com/poanetwork/nifty-wallet/pull/303): (Feature) Add Pocket Network
|
||||
- [#308](https://github.com/poanetwork/nifty-wallet/pull/308): (Fix) Fix gas price calculation
|
||||
|
||||
## 4.11.8 Wed Jul 03 2019
|
||||
|
||||
- [#305](https://github.com/poanetwork/nifty-wallet/pull/305): (Feature) gas price for RSK from the last block
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "__MSG_appName__",
|
||||
"short_name": "__MSG_appName__",
|
||||
"version": "4.11.8",
|
||||
"version": "4.11.9",
|
||||
"manifest_version": 2,
|
||||
"author": "POA Network",
|
||||
"description": "__MSG_appDescription__",
|
||||
|
|
|
@ -2,9 +2,12 @@ const mergeMiddleware = require('json-rpc-engine/src/mergeMiddleware')
|
|||
const createFetchMiddleware = require('eth-json-rpc-middleware/fetch')
|
||||
const createBlockRefRewriteMiddleware = require('eth-json-rpc-middleware/block-ref-rewrite')
|
||||
const createBlockTrackerInspectorMiddleware = require('eth-json-rpc-middleware/block-tracker-inspector')
|
||||
const createAsyncMiddleware = require('json-rpc-engine/src/createAsyncMiddleware')
|
||||
const providerFromMiddleware = require('eth-json-rpc-middleware/providerFromMiddleware')
|
||||
const BlockTracker = require('eth-block-tracker')
|
||||
|
||||
const inTest = process.env.IN_TEST === 'true'
|
||||
|
||||
module.exports = createLocalhostClient
|
||||
|
||||
function createLocalhostClient () {
|
||||
|
@ -13,9 +16,24 @@ function createLocalhostClient () {
|
|||
const blockTracker = new BlockTracker({ provider: blockProvider, pollingInterval: 1000 })
|
||||
|
||||
const networkMiddleware = mergeMiddleware([
|
||||
createEstimateGasMiddleware(),
|
||||
createBlockRefRewriteMiddleware({ blockTracker }),
|
||||
createBlockTrackerInspectorMiddleware({ blockTracker }),
|
||||
fetchMiddleware,
|
||||
])
|
||||
return { networkMiddleware, blockTracker }
|
||||
}
|
||||
|
||||
function delay (time) {
|
||||
return new Promise(resolve => setTimeout(resolve, time))
|
||||
}
|
||||
|
||||
|
||||
function createEstimateGasMiddleware () {
|
||||
return createAsyncMiddleware(async (req, _, next) => {
|
||||
if (req.method === 'eth_estimateGas' && inTest) {
|
||||
await delay(2000)
|
||||
}
|
||||
return next()
|
||||
})
|
||||
}
|
||||
|
|
|
@ -0,0 +1,124 @@
|
|||
const mergeMiddleware = require('json-rpc-engine/src/mergeMiddleware')
|
||||
const createScaffoldMiddleware = require('json-rpc-engine/src/createScaffoldMiddleware')
|
||||
const createBlockReRefMiddleware = require('eth-json-rpc-middleware/block-ref')
|
||||
const createRetryOnEmptyMiddleware = require('eth-json-rpc-middleware/retryOnEmpty')
|
||||
const createBlockCacheMiddleware = require('eth-json-rpc-middleware/block-cache')
|
||||
const createInflightMiddleware = require('eth-json-rpc-middleware/inflight-cache')
|
||||
const createBlockTrackerInspectorMiddleware = require('eth-json-rpc-middleware/block-tracker-inspector')
|
||||
const providerFromMiddleware = require('eth-json-rpc-middleware/providerFromMiddleware')
|
||||
const createPocketMiddleware = require('json-rpc-pocket')
|
||||
const BlockTracker = require('eth-block-tracker')
|
||||
const devid = 'DEVVGQ8VfHgBBet8CyowHcN'
|
||||
const {
|
||||
ROPSTEN,
|
||||
ROPSTEN_CODE,
|
||||
ROPSTEN_CHAINID,
|
||||
RINKEBY_CODE,
|
||||
RINKEBY_CHAINID,
|
||||
RINKEBY,
|
||||
KOVAN,
|
||||
KOVAN_CODE,
|
||||
KOVAN_CHAINID,
|
||||
MAINNET,
|
||||
MAINNET_CODE,
|
||||
MAINNET_CHAINID,
|
||||
ETH_TICK,
|
||||
POA_SOKOL,
|
||||
POA_CODE,
|
||||
POA_CHAINID,
|
||||
POA_TICK,
|
||||
POA,
|
||||
DAI,
|
||||
DAI_CODE,
|
||||
DAI_CHAINID,
|
||||
GOERLI_TESTNET,
|
||||
GOERLI_TESTNET_CODE,
|
||||
GOERLI_TESTNET_CHAINID,
|
||||
POA_SOKOL_CODE,
|
||||
POA_SOKOL_CHAINID,
|
||||
} = require('./enums')
|
||||
|
||||
module.exports = createPocketClient
|
||||
|
||||
function createPocketClient ({ network }) {
|
||||
const networkIDs = getNetworkIds({ network })
|
||||
const pocketMiddleware = createPocketMiddleware(devid, {
|
||||
netID: networkIDs.netId,
|
||||
network: networkIDs.ticker,
|
||||
})
|
||||
const pocketProvider = providerFromMiddleware(pocketMiddleware)
|
||||
const blockTracker = new BlockTracker({ provider: pocketProvider })
|
||||
|
||||
const networkMiddleware = mergeMiddleware([
|
||||
createNetworkAndChainIdMiddleware({ network }),
|
||||
createBlockCacheMiddleware({ blockTracker }),
|
||||
createInflightMiddleware(),
|
||||
createBlockReRefMiddleware({ blockTracker, provider: pocketProvider }),
|
||||
createRetryOnEmptyMiddleware({ blockTracker, provider: pocketProvider }),
|
||||
createBlockTrackerInspectorMiddleware({ blockTracker }),
|
||||
pocketMiddleware,
|
||||
])
|
||||
return { networkMiddleware, blockTracker }
|
||||
}
|
||||
|
||||
function getNetworkIds ({ network }) {
|
||||
let chainId
|
||||
let netId
|
||||
let ticker
|
||||
switch (network) {
|
||||
case MAINNET:
|
||||
netId = MAINNET_CODE.toString()
|
||||
chainId = MAINNET_CHAINID
|
||||
ticker = ETH_TICK
|
||||
break
|
||||
case ROPSTEN:
|
||||
netId = ROPSTEN_CODE.toString()
|
||||
chainId = ROPSTEN_CHAINID
|
||||
ticker = ETH_TICK
|
||||
break
|
||||
case RINKEBY:
|
||||
netId = RINKEBY_CODE.toString()
|
||||
chainId = RINKEBY_CHAINID
|
||||
ticker = ETH_TICK
|
||||
break
|
||||
case KOVAN:
|
||||
netId = KOVAN_CODE.toString()
|
||||
chainId = KOVAN_CHAINID
|
||||
ticker = ETH_TICK
|
||||
break
|
||||
case GOERLI_TESTNET:
|
||||
netId = GOERLI_TESTNET_CODE.toString()
|
||||
chainId = GOERLI_TESTNET_CHAINID
|
||||
ticker = ETH_TICK
|
||||
break
|
||||
case POA:
|
||||
netId = POA_CODE.toString()
|
||||
chainId = POA_CHAINID
|
||||
ticker = POA_TICK
|
||||
break
|
||||
case DAI:
|
||||
netId = DAI_CODE.toString()
|
||||
chainId = DAI_CHAINID
|
||||
ticker = POA_TICK
|
||||
break
|
||||
case POA_SOKOL:
|
||||
netId = POA_SOKOL_CODE.toString()
|
||||
chainId = POA_SOKOL_CHAINID
|
||||
ticker = POA_TICK
|
||||
break
|
||||
default:
|
||||
throw new Error(`createPocketClient - unknown network "${network}"`)
|
||||
}
|
||||
return {
|
||||
chainId, netId, ticker,
|
||||
}
|
||||
}
|
||||
|
||||
function createNetworkAndChainIdMiddleware ({ network }) {
|
||||
const networkIds = getNetworkIds({network})
|
||||
|
||||
return createScaffoldMiddleware({
|
||||
eth_chainId: networkIds.chainId,
|
||||
net_version: networkIds.netId,
|
||||
})
|
||||
}
|
|
@ -11,6 +11,18 @@ const RSK = 'rsk'
|
|||
const RSK_TESTNET = 'rsk_testnet'
|
||||
const LOCALHOST = 'localhost'
|
||||
|
||||
const ETH_TICK = 'ETH'
|
||||
const POA_TICK = 'POA'
|
||||
|
||||
const MAINNET_CHAINID = '0X01'
|
||||
const ROPSTEN_CHAINID = '0x03'
|
||||
const RINKEBY_CHAINID = '0x04'
|
||||
const KOVAN_CHAINID = '0x2a'
|
||||
const GOERLI_TESTNET_CHAINID = '0X5'
|
||||
const POA_CHAINID = '0x63'
|
||||
const DAI_CHAINID = '0x64'
|
||||
const POA_SOKOL_CHAINID = '0x4D'
|
||||
|
||||
const POA_CODE = 99
|
||||
const DAI_CODE = 100
|
||||
const POA_SOKOL_CODE = 77
|
||||
|
@ -54,6 +66,16 @@ const chainTypes = {
|
|||
|
||||
module.exports = {
|
||||
POA,
|
||||
POA_TICK,
|
||||
ETH_TICK,
|
||||
MAINNET_CHAINID,
|
||||
ROPSTEN_CHAINID,
|
||||
RINKEBY_CHAINID,
|
||||
KOVAN_CHAINID,
|
||||
GOERLI_TESTNET_CHAINID,
|
||||
POA_CHAINID,
|
||||
DAI_CHAINID,
|
||||
POA_SOKOL_CHAINID,
|
||||
DAI,
|
||||
POA_SOKOL,
|
||||
MAINNET,
|
||||
|
|
|
@ -10,9 +10,13 @@ const createMetamaskMiddleware = require('./createMetamaskMiddleware')
|
|||
const createInfuraClient = require('./createInfuraClient')
|
||||
const createJsonRpcClient = require('./createJsonRpcClient')
|
||||
const createLocalhostClient = require('./createLocalhostClient')
|
||||
const createPocketClient = require('./createPocketClient')
|
||||
const { createSwappableProxy, createEventEmitterProxy } = require('swappable-obj-proxy')
|
||||
const ethNetProps = require('eth-net-props')
|
||||
const parse = require('url-parse')
|
||||
const extend = require('extend')
|
||||
const networks = { networkList: {} }
|
||||
const { isKnownProvider } = require('../../../../old-ui/app/util')
|
||||
|
||||
const {
|
||||
ROPSTEN,
|
||||
|
@ -36,13 +40,27 @@ const {
|
|||
RSK_TESTNET_CODE,
|
||||
} = require('./enums')
|
||||
const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET]
|
||||
const POCKET_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET, POA, DAI, GOERLI_TESTNET, POA_SOKOL]
|
||||
|
||||
const env = process.env.METAMASK_ENV
|
||||
const METAMASK_DEBUG = process.env.METAMASK_DEBUG
|
||||
const testMode = (METAMASK_DEBUG || env === 'test')
|
||||
|
||||
let defaultProviderConfigType
|
||||
if (process.env.IN_TEST === 'true') {
|
||||
defaultProviderConfigType = LOCALHOST
|
||||
} else if (testMode) {
|
||||
defaultProviderConfigType = POA_SOKOL
|
||||
} else {
|
||||
defaultProviderConfigType = POA
|
||||
}
|
||||
|
||||
const defaultProviderConfig = {
|
||||
type: testMode ? POA_SOKOL : POA,
|
||||
type: defaultProviderConfigType,
|
||||
}
|
||||
|
||||
const defaultNetworkConfig = {
|
||||
ticker: 'POA',
|
||||
}
|
||||
|
||||
module.exports = class NetworkController extends EventEmitter {
|
||||
|
@ -55,7 +73,9 @@ module.exports = class NetworkController extends EventEmitter {
|
|||
// create stores
|
||||
this.providerStore = new ObservableStore(providerConfig)
|
||||
this.networkStore = new ObservableStore('loading')
|
||||
this.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore })
|
||||
this.dProviderStore = new ObservableStore({dProvider: false})
|
||||
this.networkConfig = new ObservableStore(defaultNetworkConfig)
|
||||
this.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore, dProviderStore: this.dProviderStore })
|
||||
this.on('networkDidChange', this.lookupNetwork)
|
||||
// provider and block tracker
|
||||
this._provider = null
|
||||
|
@ -67,8 +87,8 @@ module.exports = class NetworkController extends EventEmitter {
|
|||
|
||||
initializeProvider (providerParams) {
|
||||
this._baseProviderParams = providerParams
|
||||
const { type, rpcTarget } = this.providerStore.getState()
|
||||
this._configureProvider({ type, rpcTarget })
|
||||
const { type, rpcTarget, chainId, ticker, nickname } = this.providerStore.getState()
|
||||
this._configureProvider({ type, rpcTarget, chainId, ticker, nickname })
|
||||
this.lookupNetwork()
|
||||
}
|
||||
|
||||
|
@ -88,7 +108,20 @@ module.exports = class NetworkController extends EventEmitter {
|
|||
return this.networkStore.getState()
|
||||
}
|
||||
|
||||
setNetworkState (network) {
|
||||
getNetworkConfig () {
|
||||
return this.networkConfig.getState()
|
||||
}
|
||||
|
||||
setNetworkState (network, type) {
|
||||
if (network === 'loading') {
|
||||
return this.networkStore.putState(network)
|
||||
}
|
||||
|
||||
// type must be defined
|
||||
if (!type) {
|
||||
return
|
||||
}
|
||||
network = networks.networkList[type] && networks.networkList[type].chainId ? networks.networkList[type].chainId : network
|
||||
return this.networkStore.putState(network)
|
||||
}
|
||||
|
||||
|
@ -97,45 +130,46 @@ module.exports = class NetworkController extends EventEmitter {
|
|||
}
|
||||
|
||||
lookupNetwork () {
|
||||
const { type, rpcTarget } = this.providerStore.getState()
|
||||
// Prevent firing when provider is not defined.
|
||||
if (!this._provider) {
|
||||
return log.warn('NetworkController - lookupNetwork aborted due to missing provider')
|
||||
}
|
||||
const { type, rpcTarget } = this.providerStore.getState()
|
||||
const ethQuery = new EthQuery(this._provider)
|
||||
const initialNetwork = this.getNetworkState()
|
||||
ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
|
||||
if (err) return this.setNetworkState('loading')
|
||||
const targetHost = parse(rpcTarget, true).host
|
||||
const classicHost = parse(ethNetProps.RPCEndpoints(CLASSIC_CODE)[0], true).host
|
||||
if (type === CLASSIC || targetHost === classicHost) {
|
||||
network = CLASSIC_CODE.toString()
|
||||
} // workaround to avoid Mainnet and Classic are having the same network ID
|
||||
const currentNetwork = this.getNetworkState()
|
||||
if (initialNetwork === currentNetwork) {
|
||||
if (err) {
|
||||
return this.setNetworkState('loading')
|
||||
}
|
||||
log.info('web3.getNetwork returned ' + network)
|
||||
this.setNetworkState(network)
|
||||
this.setNetworkState(network, type)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
setRpcTarget (rpcTarget) {
|
||||
setRpcTarget (rpcTarget, chainId, ticker = 'ETH', nickname = '', rpcPrefs) {
|
||||
const providerConfig = {
|
||||
type: 'rpc',
|
||||
rpcTarget,
|
||||
chainId,
|
||||
ticker,
|
||||
nickname,
|
||||
rpcPrefs,
|
||||
}
|
||||
this.providerConfig = providerConfig
|
||||
}
|
||||
|
||||
async setProviderType (type) {
|
||||
async setProviderType (type, rpcTarget = '', ticker = 'ETH', nickname = '') {
|
||||
assert.notEqual(type, 'rpc', `NetworkController - cannot call "setProviderType" with type 'rpc'. use "setRpcTarget"`)
|
||||
assert(INFURA_PROVIDER_TYPES.includes(type) ||
|
||||
type === LOCALHOST ||
|
||||
type === POA_SOKOL ||
|
||||
type === POA ||
|
||||
type === DAI ||
|
||||
type === GOERLI_TESTNET ||
|
||||
type === CLASSIC ||
|
||||
type === RSK ||
|
||||
type === RSK_TESTNET
|
||||
, `NetworkController - Unknown rpc type "${type}"`)
|
||||
const providerConfig = { type }
|
||||
assert(isKnownProvider(type), `NetworkController - Unknown rpc type "${type}"`)
|
||||
const providerConfig = { type, rpcTarget, ticker, nickname }
|
||||
this.providerConfig = providerConfig
|
||||
}
|
||||
|
||||
|
@ -152,6 +186,16 @@ module.exports = class NetworkController extends EventEmitter {
|
|||
return this.providerStore.getState()
|
||||
}
|
||||
|
||||
getDProvider () {
|
||||
return this.dProviderStore.getState().dProvider
|
||||
}
|
||||
|
||||
setDProvider (key) {
|
||||
this.dProviderStore.updateState({
|
||||
dProvider: key,
|
||||
})
|
||||
}
|
||||
|
||||
//
|
||||
// Private
|
||||
//
|
||||
|
@ -159,35 +203,46 @@ module.exports = class NetworkController extends EventEmitter {
|
|||
_switchNetwork (opts) {
|
||||
this.setNetworkState('loading')
|
||||
this._configureProvider(opts)
|
||||
this.emit('networkDidChange')
|
||||
this.emit('networkDidChange', opts.type)
|
||||
}
|
||||
|
||||
_configureProvider (opts) {
|
||||
const { type, rpcTarget } = opts
|
||||
const { type, rpcTarget, chainId, ticker, nickname } = opts
|
||||
// infura type-based endpoints
|
||||
const isInfura = INFURA_PROVIDER_TYPES.includes(type)
|
||||
if (isInfura) {
|
||||
// pocket type-based endpointes
|
||||
const isPocket = POCKET_PROVIDER_TYPES.includes(type)
|
||||
|
||||
if (!isPocket && this.dProviderStore.getState().dProvider) {
|
||||
this.dProviderStore.updateState({
|
||||
dProvider: false,
|
||||
})
|
||||
}
|
||||
|
||||
if (isPocket && this.dProviderStore.getState().dProvider) {
|
||||
this._configurePocketProvider(opts)
|
||||
} else if (isInfura) {
|
||||
this._configureInfuraProvider(opts)
|
||||
// other type-based rpc endpoints
|
||||
} else if (type === POA) {
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_CODE)[0] })
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_CODE)[0], chainId, ticker, nickname })
|
||||
} else if (type === DAI) {
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(DAI_CODE)[0] })
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(DAI_CODE)[0], chainId, ticker, nickname })
|
||||
} else if (type === POA_SOKOL) {
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_SOKOL_CODE)[0] })
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_SOKOL_CODE)[0], chainId, ticker, nickname })
|
||||
} else if (type === GOERLI_TESTNET) {
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(GOERLI_TESTNET_CODE)[0] })
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(GOERLI_TESTNET_CODE)[0], chainId, ticker, nickname })
|
||||
} else if (type === CLASSIC) {
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(CLASSIC_CODE)[0] })
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(CLASSIC_CODE)[0], chainId, ticker, nickname })
|
||||
} else if (type === RSK) {
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(RSK_CODE)[0] })
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(RSK_CODE)[0], chainId, ticker, nickname })
|
||||
} else if (type === RSK_TESTNET) {
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(RSK_TESTNET_CODE)[0] })
|
||||
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(RSK_TESTNET_CODE)[0], chainId, ticker, nickname })
|
||||
} else if (type === LOCALHOST) {
|
||||
this._configureLocalhostProvider()
|
||||
// url-based rpc endpoints
|
||||
} else if (type === 'rpc') {
|
||||
this._configureStandardProvider({ rpcUrl: rpcTarget })
|
||||
this._configureStandardProvider({ rpcUrl: rpcTarget, chainId, ticker, nickname })
|
||||
} else {
|
||||
throw new Error(`NetworkController - _configureProvider - unknown type "${type}"`)
|
||||
}
|
||||
|
@ -197,6 +252,17 @@ module.exports = class NetworkController extends EventEmitter {
|
|||
log.info('NetworkController - configureInfuraProvider', type)
|
||||
const networkClient = createInfuraClient({ network: type })
|
||||
this._setNetworkClient(networkClient)
|
||||
// setup networkConfig
|
||||
var settings = {
|
||||
ticker: 'ETH',
|
||||
}
|
||||
this.networkConfig.putState(settings)
|
||||
}
|
||||
|
||||
_configurePocketProvider ({ type }) {
|
||||
log.info('NetworkController - configurePocketProvider', type)
|
||||
const networkClient = createPocketClient({ network: type })
|
||||
this._setNetworkClient(networkClient)
|
||||
}
|
||||
|
||||
_configureLocalhostProvider () {
|
||||
|
@ -205,9 +271,22 @@ module.exports = class NetworkController extends EventEmitter {
|
|||
this._setNetworkClient(networkClient)
|
||||
}
|
||||
|
||||
_configureStandardProvider ({ rpcUrl }) {
|
||||
_configureStandardProvider ({ rpcUrl, chainId, ticker, nickname }) {
|
||||
log.info('NetworkController - configureStandardProvider', rpcUrl)
|
||||
const networkClient = createJsonRpcClient({ rpcUrl })
|
||||
// hack to add a 'rpc' network with chainId
|
||||
networks.networkList['rpc'] = {
|
||||
chainId: chainId,
|
||||
rpcUrl,
|
||||
ticker: ticker || 'ETH',
|
||||
nickname,
|
||||
}
|
||||
// setup networkConfig
|
||||
var settings = {
|
||||
network: chainId,
|
||||
}
|
||||
settings = extend(settings, networks.networkList['rpc'])
|
||||
this.networkConfig.putState(settings)
|
||||
this._setNetworkClient(networkClient)
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@ const extend = require('xtend')
|
|||
const EthQuery = require('eth-query')
|
||||
const log = require('loglevel')
|
||||
const pify = require('pify')
|
||||
const { isKnownProvider, ifRSKByProviderType } = require('../../../old-ui/app/util')
|
||||
|
||||
|
||||
class RecentBlocksController {
|
||||
|
||||
|
@ -24,26 +26,58 @@ class RecentBlocksController {
|
|||
*
|
||||
*/
|
||||
constructor (opts = {}) {
|
||||
const { blockTracker, provider } = opts
|
||||
const { blockTracker, provider, networkController } = opts
|
||||
const { type } = networkController.getProviderConfig()
|
||||
this.blockTracker = blockTracker
|
||||
this.ethQuery = new EthQuery(provider)
|
||||
this.historyLength = opts.historyLength || 40
|
||||
this.setHistoryLength(type, opts)
|
||||
|
||||
const initState = extend({
|
||||
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
|
||||
|
||||
if (!isKnownProvider(type) && type !== 'loading') {
|
||||
this.blockTracker.on('latest', blockListner)
|
||||
isListening = true
|
||||
}
|
||||
networkController.on('networkDidChange', (newType) => {
|
||||
this.setHistoryLength(newType, opts)
|
||||
this.resetState()
|
||||
this.backfill()
|
||||
if (isKnownProvider(newType) && isListening) {
|
||||
this.blockTracker.removeListener('latest', blockListner)
|
||||
} else if (
|
||||
!isKnownProvider(type) &&
|
||||
type !== 'loading' &&
|
||||
!isListening
|
||||
) {
|
||||
this.blockTracker.on('latest', blockListner)
|
||||
}
|
||||
})
|
||||
this.backfill()
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets historyLength param
|
||||
*
|
||||
*/
|
||||
setHistoryLength (type, opts) {
|
||||
if (ifRSKByProviderType(type)) {
|
||||
this.historyLength = 1
|
||||
} else {
|
||||
this.historyLength = opts.historyLength || 40
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets store.recentBlocks to an empty array
|
||||
*
|
||||
|
|
|
@ -130,6 +130,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.
|
||||
|
@ -370,6 +371,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||
setCurrentCoin: this.setCurrentCoin.bind(this),
|
||||
setUseBlockie: this.setUseBlockie.bind(this),
|
||||
setCurrentLocale: this.setCurrentLocale.bind(this),
|
||||
setDProvider: this.setDProvider.bind(this),
|
||||
markAccountsFound: this.markAccountsFound.bind(this),
|
||||
markPasswordForgotten: this.markPasswordForgotten.bind(this),
|
||||
unMarkPasswordForgotten: this.unMarkPasswordForgotten.bind(this),
|
||||
|
@ -1750,6 +1752,20 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A method for setting a user's preference of decent provider
|
||||
* @param {string} key - boolean for decentralized provider
|
||||
* @param {Function} cb - A callback function called when complete.
|
||||
*/
|
||||
setDProvider (key, cb) {
|
||||
try {
|
||||
this.networkController.setDProvider(key)
|
||||
cb(null)
|
||||
} catch (err) {
|
||||
cb(err)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A method for initializing storage the first time.
|
||||
* @param {Object} initState - The default state to initialize with.
|
||||
|
|
|
@ -70,8 +70,8 @@ class NetworksMenu extends Component {
|
|||
key={'default'}
|
||||
closeMenu={() => this.props.updateNetworksMenuOpenState(!isOpen)}
|
||||
onClick={() => {
|
||||
props.setRpcTarget('http://localhost:8545')
|
||||
props.setProviderType(LOCALHOST)
|
||||
props.setProviderType(LOCALHOST, LOCALHOST_RPC_URL)
|
||||
props.setRpcTarget(LOCALHOST_RPC_URL)
|
||||
}}
|
||||
style={{
|
||||
paddingLeft: '20px',
|
||||
|
|
|
@ -13,6 +13,17 @@ const exportAsFile = require('./util').exportAsFile
|
|||
const Modal = require('../../ui/app/components/modals/index').Modal
|
||||
const ethNetProps = require('eth-net-props')
|
||||
const { networks } = require('../../app/scripts/controllers/network/util')
|
||||
const {
|
||||
ROPSTEN,
|
||||
RINKEBY,
|
||||
KOVAN,
|
||||
MAINNET,
|
||||
POA,
|
||||
DAI,
|
||||
POA_SOKOL,
|
||||
GOERLI_TESTNET,
|
||||
} = require('../../app/scripts/controllers/network/enums')
|
||||
const POCKET_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET, POA, DAI, GOERLI_TESTNET, POA_SOKOL]
|
||||
|
||||
class ConfigScreen extends Component {
|
||||
|
||||
|
@ -20,11 +31,13 @@ class ConfigScreen extends Component {
|
|||
super(props)
|
||||
this.state = {
|
||||
loading: false,
|
||||
dProvider: props.metamask.dProviderStore.dProvider,
|
||||
}
|
||||
}
|
||||
|
||||
static propTypes = {
|
||||
dispatch: PropTypes.func,
|
||||
metamask: PropTypes.object,
|
||||
}
|
||||
|
||||
render () {
|
||||
|
@ -32,6 +45,12 @@ class ConfigScreen extends Component {
|
|||
const metamaskState = state.metamask
|
||||
const warning = state.warning
|
||||
|
||||
if (state.metamask.dProviderStore.dProvider !== this.state.dProvider) {
|
||||
this.setState({
|
||||
dProvider: this.props.metamask.dProviderStore.dProvider,
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
h('.flex-column.flex-grow', {
|
||||
style: {
|
||||
|
@ -90,10 +109,10 @@ class ConfigScreen extends Component {
|
|||
width: 'inherit',
|
||||
flex: '1 0 auto',
|
||||
height: '32px',
|
||||
margin: '20px 20px 0 0',
|
||||
borderRadius: '3px',
|
||||
border: '1px solid #e2e2e2',
|
||||
padding: '10px',
|
||||
marginBottom: '20px',
|
||||
},
|
||||
onKeyPress: (event) => {
|
||||
if (event.key === 'Enter') {
|
||||
|
@ -103,11 +122,9 @@ class ConfigScreen extends Component {
|
|||
}
|
||||
},
|
||||
}),
|
||||
h('button', {
|
||||
style: {
|
||||
alignSelf: 'center',
|
||||
marginTop: '20px',
|
||||
},
|
||||
]),
|
||||
|
||||
h('button.btn-spread', {
|
||||
onClick: (event) => {
|
||||
event.preventDefault()
|
||||
const element = document.querySelector('input#new_rpc')
|
||||
|
@ -115,32 +132,17 @@ class ConfigScreen extends Component {
|
|||
this.rpcValidation(newRpc, state)
|
||||
},
|
||||
}, 'Save'),
|
||||
]),
|
||||
|
||||
h('hr.horizontal-line'),
|
||||
|
||||
this.currentConversionInformation(metamaskState, state),
|
||||
|
||||
h('hr.horizontal-line', {
|
||||
style: {
|
||||
marginTop: '20px',
|
||||
},
|
||||
}),
|
||||
h('hr.horizontal-line'),
|
||||
|
||||
h('div', {
|
||||
style: {
|
||||
marginTop: '20px',
|
||||
},
|
||||
}, [
|
||||
h('p', {
|
||||
style: {
|
||||
fontFamily: 'Nunito Regular',
|
||||
fontSize: '14px',
|
||||
lineHeight: '18px',
|
||||
},
|
||||
}, `State logs contain your public account addresses and sent transactions.`),
|
||||
h('br'),
|
||||
h('button', {
|
||||
h('div', [
|
||||
h('p.config-title', `State logs`),
|
||||
h('p.config-description', `State logs contain your public account addresses and sent transactions.`),
|
||||
h('button.btn-spread', {
|
||||
style: {
|
||||
alignSelf: 'center',
|
||||
},
|
||||
|
@ -156,18 +158,12 @@ class ConfigScreen extends Component {
|
|||
}, 'Download State Logs'),
|
||||
]),
|
||||
|
||||
h('hr.horizontal-line', {
|
||||
style: {
|
||||
marginTop: '20px',
|
||||
},
|
||||
}),
|
||||
h('hr.horizontal-line'),
|
||||
|
||||
h('div', {
|
||||
style: {
|
||||
marginTop: '20px',
|
||||
},
|
||||
}, [
|
||||
h('button', {
|
||||
h('div', [
|
||||
h('p.config-title', `Seed words`),
|
||||
h('p.config-description', `Reveal seed words.`),
|
||||
h('button.btn-spread', {
|
||||
style: {
|
||||
alignSelf: 'center',
|
||||
},
|
||||
|
@ -184,12 +180,6 @@ class ConfigScreen extends Component {
|
|||
},
|
||||
}),
|
||||
|
||||
h('div', {
|
||||
style: {
|
||||
marginTop: '20px',
|
||||
},
|
||||
}, [
|
||||
|
||||
h('p', {
|
||||
style: {
|
||||
fontFamily: 'Nunito Regular',
|
||||
|
@ -197,11 +187,54 @@ class ConfigScreen extends Component {
|
|||
lineHeight: '18px',
|
||||
},
|
||||
}, [
|
||||
'Resetting is for developer use only. ',
|
||||
'Switch to Decentralized Provider (Pocket)',
|
||||
]),
|
||||
h('br'),
|
||||
|
||||
h('button', {
|
||||
h('input', {
|
||||
type: 'checkbox',
|
||||
name: 'pocket-checkbox',
|
||||
checked: this.state.dProvider,
|
||||
onChange: (event) => {
|
||||
event.preventDefault()
|
||||
this.toggleProvider()
|
||||
},
|
||||
}),
|
||||
|
||||
h('p.config-title', `Provider`),
|
||||
|
||||
h('div', {
|
||||
style: {
|
||||
display: 'table',
|
||||
width: '100%',
|
||||
},
|
||||
}, [
|
||||
h('div', {
|
||||
style: {
|
||||
display: 'table-cell',
|
||||
}}, [
|
||||
h('p.config-description', 'Switch to Decentralized Provider (Pocket)'),
|
||||
]),
|
||||
h('div', { style: {
|
||||
display: 'table-cell',
|
||||
}}, [
|
||||
h('input', {
|
||||
type: 'checkbox',
|
||||
name: 'pocket-checkbox',
|
||||
checked: this.state.dProvider,
|
||||
onChange: (event) => {
|
||||
event.preventDefault()
|
||||
this.toggleProvider()
|
||||
},
|
||||
}),
|
||||
]),
|
||||
]),
|
||||
|
||||
h('hr.horizontal-line'),
|
||||
|
||||
h('div', [
|
||||
h('p.config-title', `Account`),
|
||||
h('p.config-description', `Resetting is for developer use only.`),
|
||||
h('button.btn-spread', {
|
||||
style: {
|
||||
alignSelf: 'center',
|
||||
},
|
||||
|
@ -211,16 +244,9 @@ class ConfigScreen extends Component {
|
|||
},
|
||||
}, 'Reset Account'),
|
||||
|
||||
h('hr.horizontal-line', {
|
||||
style: {
|
||||
marginTop: '20px',
|
||||
},
|
||||
}),
|
||||
h('p.config-description', 'Changing of password'),
|
||||
|
||||
h('button', {
|
||||
style: {
|
||||
alignSelf: 'center',
|
||||
},
|
||||
h('button.btn-spread', {
|
||||
onClick (event) {
|
||||
event.preventDefault()
|
||||
state.dispatch(actions.confirmChangePassword())
|
||||
|
@ -233,6 +259,26 @@ class ConfigScreen extends Component {
|
|||
)
|
||||
}
|
||||
|
||||
toggleProvider () {
|
||||
const isPocket = POCKET_PROVIDER_TYPES.includes(this.props.metamask.provider.type)
|
||||
if (isPocket) {
|
||||
if (!this.state.dProvider) {
|
||||
this.props.dispatch(actions.setDProvider(true))
|
||||
this.setState({
|
||||
dProvider: true,
|
||||
})
|
||||
} else {
|
||||
this.props.dispatch(actions.setDProvider(false))
|
||||
this.setState({
|
||||
dProvider: false,
|
||||
})
|
||||
}
|
||||
this.props.dispatch(actions.setProviderType(this.props.metamask.provider.type))
|
||||
} else {
|
||||
alert('Pocket does not support this network, using centralized provider')
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount () {
|
||||
this.props.dispatch(actions.displayWarning(''))
|
||||
}
|
||||
|
@ -266,9 +312,9 @@ class ConfigScreen extends Component {
|
|||
const currentCurrency = metamaskState.currentCurrency
|
||||
const conversionDate = metamaskState.conversionDate
|
||||
return h('div', [
|
||||
h('span', {style: { fontWeight: 'bold', paddingRight: '10px'}}, 'Current Conversion'),
|
||||
h('span', {style: { fontWeight: 'bold', paddingRight: '10px', fontSize: '13px'}}, `Updated ${Date(conversionDate)}`),
|
||||
h('select#currentCurrency', {
|
||||
h('div.config-title', 'Current Conversion'),
|
||||
h('div.config-description', `Updated ${Date(conversionDate)}`),
|
||||
h('select.config-select-currency#currentCurrency', {
|
||||
onChange (event) {
|
||||
event.preventDefault()
|
||||
const element = document.getElementById('currentCurrency')
|
||||
|
@ -296,9 +342,9 @@ class ConfigScreen extends Component {
|
|||
}
|
||||
|
||||
return h('div', [
|
||||
h('span', {style: { fontWeight: 'bold', paddingRight: '10px'}}, title),
|
||||
h('span', value),
|
||||
provider.type === 'rpc' && h('button', {
|
||||
h('div.config-title', title),
|
||||
h('div.config-description', value),
|
||||
provider.type === 'rpc' && h('button.btn-spread', {
|
||||
onClick (event) {
|
||||
event.preventDefault()
|
||||
state.dispatch(actions.showDeleteRPC())
|
||||
|
@ -306,7 +352,6 @@ class ConfigScreen extends Component {
|
|||
}, 'Delete'),
|
||||
])
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function mapStateToProps (state) {
|
||||
|
|
|
@ -117,6 +117,11 @@ button, input[type="submit"] {
|
|||
/*box-shadow: 0px 5px 10px 0px rgba(92, 52, 162, 0.3);*/
|
||||
}
|
||||
|
||||
.btn-spread {
|
||||
width: 100%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.btn-green, input[type="submit"].btn-green {
|
||||
background: #60db97;
|
||||
}
|
||||
|
@ -1195,3 +1200,23 @@ div.message-container > div:first-child {
|
|||
input[disabled],textarea[disabled] {
|
||||
background: #FFFADE
|
||||
}
|
||||
|
||||
.config-title {
|
||||
font-family: 'Nunito Semibold';
|
||||
color: #333333;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.config-description {
|
||||
font-family: 'Nunito Regular';
|
||||
font-size: 14px;
|
||||
color: #888888;
|
||||
line-height: 18px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.config-select-currency {
|
||||
height: 32px;
|
||||
width: 100%;
|
||||
margin-bottom: 20px;
|
||||
}
|
|
@ -171,7 +171,6 @@ hr.horizontal-line {
|
|||
height: 1px;
|
||||
border: 0;
|
||||
border-top: 1px solid #ccc;
|
||||
margin: 1em 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,18 @@ const {
|
|||
DAI_CODE,
|
||||
RSK_CODE,
|
||||
RSK_TESTNET_CODE,
|
||||
ROPSTEN,
|
||||
RINKEBY,
|
||||
KOVAN,
|
||||
MAINNET,
|
||||
LOCALHOST,
|
||||
POA_SOKOL,
|
||||
POA,
|
||||
DAI,
|
||||
GOERLI_TESTNET,
|
||||
CLASSIC,
|
||||
RSK,
|
||||
RSK_TESTNET,
|
||||
} = require('../../app/scripts/controllers/network/enums')
|
||||
|
||||
var valueTable = {
|
||||
|
@ -54,9 +66,12 @@ module.exports = {
|
|||
ifHardwareAcc,
|
||||
getAllKeyRingsAccounts,
|
||||
ifRSK,
|
||||
ifRSKByProviderType,
|
||||
ifPOA,
|
||||
toChecksumAddress,
|
||||
isValidChecksumAddress,
|
||||
isInfuraProvider,
|
||||
isKnownProvider,
|
||||
}
|
||||
|
||||
function valuesFor (obj) {
|
||||
|
@ -391,6 +406,11 @@ function ifRSK (network) {
|
|||
return numericNet === RSK_CODE || numericNet === RSK_TESTNET_CODE
|
||||
}
|
||||
|
||||
function ifRSKByProviderType (type) {
|
||||
if (!type) return false
|
||||
return type === RSK || type === RSK_TESTNET
|
||||
}
|
||||
|
||||
function ifPOA (network) {
|
||||
if (!network) return false
|
||||
const numericNet = isNaN(network) ? network : parseInt(network)
|
||||
|
@ -424,3 +444,21 @@ function toChecksumAddress (network, address, chainId = null) {
|
|||
function isValidChecksumAddress (network, address) {
|
||||
return isValidAddress(address, network) && toChecksumAddress(network, address) === address
|
||||
}
|
||||
|
||||
function isInfuraProvider (type) {
|
||||
const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET]
|
||||
return INFURA_PROVIDER_TYPES.includes(type)
|
||||
}
|
||||
|
||||
function isKnownProvider (type) {
|
||||
const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET]
|
||||
return INFURA_PROVIDER_TYPES.includes(type) ||
|
||||
type === LOCALHOST ||
|
||||
type === POA_SOKOL ||
|
||||
type === POA ||
|
||||
type === DAI ||
|
||||
type === GOERLI_TESTNET ||
|
||||
type === CLASSIC ||
|
||||
type === RSK ||
|
||||
type === RSK_TESTNET
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -81,6 +81,7 @@
|
|||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.5.0",
|
||||
"@material-ui/core": "^4.1.1",
|
||||
"@zxing/library": "^0.8.0",
|
||||
"abi-decoder": "^1.0.9",
|
||||
|
@ -148,6 +149,7 @@
|
|||
"inject-css": "^0.1.1",
|
||||
"json-rpc-engine": "^4.0.0",
|
||||
"json-rpc-middleware-stream": "^2.1.0",
|
||||
"json-rpc-pocket": "0.0.1",
|
||||
"jsonschema": "^1.2.4",
|
||||
"lodash.debounce": "^4.0.8",
|
||||
"lodash.shuffle": "^4.2.0",
|
||||
|
@ -231,7 +233,7 @@
|
|||
"brfs": "^1.6.1",
|
||||
"browserify": "^16.2.3",
|
||||
"chai": "^4.1.0",
|
||||
"chromedriver": "^74.0.0",
|
||||
"chromedriver": "^76.0.0",
|
||||
"clipboardy": "^1.2.3",
|
||||
"compression": "^1.7.1",
|
||||
"coveralls": "^3.0.0",
|
||||
|
@ -253,7 +255,7 @@
|
|||
"fs-extra": "^6.0.1",
|
||||
"fs-promise": "^2.0.3",
|
||||
"ganache-cli": "^6.4.4",
|
||||
"ganache-core": "^2.5.6",
|
||||
"ganache-core": "^2.7.0",
|
||||
"geckodriver": "^1.12.2",
|
||||
"gh-pages": "^1.2.0",
|
||||
"gifencoder": "^1.1.0",
|
||||
|
@ -306,7 +308,7 @@
|
|||
"resolve-url-loader": "^2.3.0",
|
||||
"rimraf": "^2.6.2",
|
||||
"sass-loader": "^7.0.1",
|
||||
"selenium-webdriver": "^4.0.0-alpha.1",
|
||||
"selenium-webdriver": "^4.0.0-alpha.4",
|
||||
"shell-parallel": "^1.0.3",
|
||||
"sinon": "^5.0.0",
|
||||
"source-map": "^0.7.2",
|
||||
|
|
|
@ -1,145 +1,146 @@
|
|||
const path = require('path')
|
||||
const Func = require('./func').Functions
|
||||
const account1 = '0x2E428ABd9313D256d64D1f69fe3929C3BE18fD1f'
|
||||
const account2 = '0xd7b7AFeCa35e32594e29504771aC847E2a803742'
|
||||
const testsFolder = './test-cases'
|
||||
const setup = require(`${testsFolder}/setup.spec`)
|
||||
const login = require(`${testsFolder}/login.spec`)
|
||||
const { accountCreation, getCreatedAccounts } = require(`${testsFolder}/account-creation.spec`)
|
||||
const connectHDWallet = require(`${testsFolder}/connect-hd-wallet.spec`)
|
||||
const importAccount = require(`${testsFolder}/import-account.spec`)
|
||||
const importContractAccount = require(`${testsFolder}/import-contract-account.spec`)
|
||||
const deleteImportedAccount = require(`${testsFolder}/delete-imported-account.spec`)
|
||||
const signData = require(`${testsFolder}/sign-data.spec`)
|
||||
const exportPrivateKey = require(`${testsFolder}/export-private-key.spec`)
|
||||
const importGanacheSeedPhrase = require(`${testsFolder}/import-ganache-seed-phrase.spec`)
|
||||
const RSKNetworkTests = require(`${testsFolder}/RSK-network-tests.js`)
|
||||
const checkEmittedEvents = require(`${testsFolder}/check-emitted-events.spec`)
|
||||
// const addCustomToken = require(`${testsFolder}/add-token-custom.spec`)
|
||||
const changePassword = require(`${testsFolder}/change-password.spec`)
|
||||
const addTokeFromSearch = require(`${testsFolder}/add-token-search.spec`)
|
||||
const customRPC = require(`${testsFolder}/custom-rpc.spec`)
|
||||
// const path = require('path')
|
||||
// const Func = require('./func').Functions
|
||||
// const account1 = '0x2E428ABd9313D256d64D1f69fe3929C3BE18fD1f'
|
||||
// const account1RSK = '0x2E428aBd9313D256d64D1f69fe3929c3Be18Fd1F'
|
||||
// const account2 = '0xd7b7AFeCa35e32594e29504771aC847E2a803742'
|
||||
// const testsFolder = './test-cases'
|
||||
// const setup = require(`${testsFolder}/setup.spec`)
|
||||
// const login = require(`${testsFolder}/login.spec`)
|
||||
// const { accountCreation, getCreatedAccounts } = require(`${testsFolder}/account-creation.spec`)
|
||||
// const connectHDWallet = require(`${testsFolder}/connect-hd-wallet.spec`)
|
||||
// const importAccount = require(`${testsFolder}/import-account.spec`)
|
||||
// const importContractAccount = require(`${testsFolder}/import-contract-account.spec`)
|
||||
// const deleteImportedAccount = require(`${testsFolder}/delete-imported-account.spec`)
|
||||
// const signData = require(`${testsFolder}/sign-data.spec`)
|
||||
// const exportPrivateKey = require(`${testsFolder}/export-private-key.spec`)
|
||||
// const importGanacheSeedPhrase = require(`${testsFolder}/import-ganache-seed-phrase.spec`)
|
||||
// const RSKNetworkTests = require(`${testsFolder}/RSK-network-tests.js`)
|
||||
// const checkEmittedEvents = require(`${testsFolder}/check-emitted-events.spec`)
|
||||
// // const addCustomToken = require(`${testsFolder}/add-token-custom.spec`)
|
||||
// const changePassword = require(`${testsFolder}/change-password.spec`)
|
||||
// const addTokeFromSearch = require(`${testsFolder}/add-token-search.spec`)
|
||||
// const customRPC = require(`${testsFolder}/custom-rpc.spec`)
|
||||
|
||||
describe('Metamask popup page', async function () {
|
||||
// describe('Metamask popup page', async function () {
|
||||
|
||||
this.timeout(15 * 60 * 1000)
|
||||
const f = new Func()
|
||||
let driver, extensionId
|
||||
const password = '123456789'
|
||||
const newPassword = {
|
||||
correct: 'abcDEF123!@#',
|
||||
short: '123',
|
||||
incorrect: '1234567890',
|
||||
}
|
||||
// this.timeout(15 * 60 * 1000)
|
||||
// const f = new Func()
|
||||
// let driver, extensionId
|
||||
// const password = '123456789'
|
||||
// const newPassword = {
|
||||
// correct: 'abcDEF123!@#',
|
||||
// short: '123',
|
||||
// incorrect: '1234567890',
|
||||
// }
|
||||
|
||||
before(async function () {
|
||||
if (process.env.SELENIUM_BROWSER === 'chrome') {
|
||||
const extPath = path.resolve('dist/chrome')
|
||||
driver = await Func.buildChromeWebDriver(extPath)
|
||||
f.driver = driver
|
||||
extensionId = await f.getExtensionIdChrome()
|
||||
f.extensionId = extensionId
|
||||
await driver.get(`chrome-extension://${extensionId}/popup.html`)
|
||||
// before(async function () {
|
||||
// if (process.env.SELENIUM_BROWSER === 'chrome') {
|
||||
// const extPath = path.resolve('dist/chrome')
|
||||
// driver = await Func.buildChromeWebDriver(extPath)
|
||||
// f.driver = driver
|
||||
// extensionId = await f.getExtensionIdChrome()
|
||||
// f.extensionId = extensionId
|
||||
// await driver.get(`chrome-extension://${extensionId}/popup.html`)
|
||||
|
||||
} else if (process.env.SELENIUM_BROWSER === 'firefox') {
|
||||
const extPath = path.resolve('dist/firefox')
|
||||
driver = await Func.buildFirefoxWebdriver()
|
||||
f.driver = driver
|
||||
await f.installWebExt(extPath)
|
||||
await f.delay(700)
|
||||
extensionId = await f.getExtensionIdFirefox()
|
||||
f.extensionId = extensionId
|
||||
await driver.get(`moz-extension://${extensionId}/popup.html`)
|
||||
}
|
||||
// } else if (process.env.SELENIUM_BROWSER === 'firefox') {
|
||||
// const extPath = path.resolve('dist/firefox')
|
||||
// driver = await Func.buildFirefoxWebdriver()
|
||||
// f.driver = driver
|
||||
// await f.installWebExt(extPath)
|
||||
// await f.delay(700)
|
||||
// extensionId = await f.getExtensionIdFirefox()
|
||||
// f.extensionId = extensionId
|
||||
// await driver.get(`moz-extension://${extensionId}/popup.html`)
|
||||
// }
|
||||
|
||||
})
|
||||
// })
|
||||
|
||||
afterEach(async function () {
|
||||
// logs command not supported in firefox
|
||||
// https://github.com/SeleniumHQ/selenium/issues/2910
|
||||
if (process.env.SELENIUM_BROWSER === 'chrome') {
|
||||
// check for console errors
|
||||
const errors = await f.checkBrowserForConsoleErrors(driver)
|
||||
if (errors.length) {
|
||||
const errorReports = errors.map(err => err.message)
|
||||
const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}`
|
||||
console.log(errorMessage)
|
||||
}
|
||||
}
|
||||
// gather extra data if test failed
|
||||
if (this.currentTest.state === 'failed') {
|
||||
await f.verboseReportOnFailure(this.currentTest)
|
||||
}
|
||||
})
|
||||
// afterEach(async function () {
|
||||
// // logs command not supported in firefox
|
||||
// // https://github.com/SeleniumHQ/selenium/issues/2910
|
||||
// if (process.env.SELENIUM_BROWSER === 'chrome') {
|
||||
// // check for console errors
|
||||
// const errors = await f.checkBrowserForConsoleErrors(driver)
|
||||
// if (errors.length) {
|
||||
// const errorReports = errors.map(err => err.message)
|
||||
// const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}`
|
||||
// console.log(errorMessage)
|
||||
// }
|
||||
// }
|
||||
// // gather extra data if test failed
|
||||
// if (this.currentTest.state === 'failed') {
|
||||
// await f.verboseReportOnFailure(this.currentTest)
|
||||
// }
|
||||
// })
|
||||
|
||||
after(async function () {
|
||||
await driver.quit()
|
||||
})
|
||||
// after(async function () {
|
||||
// await driver.quit()
|
||||
// })
|
||||
|
||||
describe('Setup', async () => {
|
||||
await setup(f)
|
||||
})
|
||||
// describe('Setup', async () => {
|
||||
// await setup(f)
|
||||
// })
|
||||
|
||||
describe('Log In', async () => {
|
||||
await login(f, password)
|
||||
})
|
||||
// describe('Log In', async () => {
|
||||
// await login(f, password)
|
||||
// })
|
||||
|
||||
describe('Account Creation', async () => {
|
||||
await accountCreation(f, password)
|
||||
})
|
||||
// describe('Account Creation', async () => {
|
||||
// await accountCreation(f, password)
|
||||
// })
|
||||
|
||||
describe('Connect Hardware Wallet', async () => {
|
||||
await connectHDWallet(f)
|
||||
})
|
||||
// describe('Connect Hardware Wallet', async () => {
|
||||
// await connectHDWallet(f)
|
||||
// })
|
||||
|
||||
describe('Import Account', async () => {
|
||||
await importAccount(f)
|
||||
})
|
||||
// describe('Import Account', async () => {
|
||||
// await importAccount(f)
|
||||
// })
|
||||
|
||||
describe('Import Contract account', async () => {
|
||||
await importContractAccount(f, account1, getCreatedAccounts)
|
||||
})
|
||||
// describe('Import Contract account', async () => {
|
||||
// await importContractAccount(f, account1, getCreatedAccounts)
|
||||
// })
|
||||
|
||||
describe('Delete Imported Account', async () => {
|
||||
await deleteImportedAccount(f)
|
||||
})
|
||||
// describe('Delete Imported Account', async () => {
|
||||
// await deleteImportedAccount(f)
|
||||
// })
|
||||
|
||||
describe('Sign Data', async () => {
|
||||
await signData(f)
|
||||
})
|
||||
// describe('Sign Data', async () => {
|
||||
// await signData(f)
|
||||
// })
|
||||
|
||||
describe('Export private key', async () => {
|
||||
await exportPrivateKey(f, password)
|
||||
})
|
||||
// describe('Export private key', async () => {
|
||||
// await exportPrivateKey(f, password)
|
||||
// })
|
||||
|
||||
describe('Import Ganache seed phrase', async () => {
|
||||
await importGanacheSeedPhrase(f, account2, password)
|
||||
})
|
||||
// describe('Import Ganache seed phrase', async () => {
|
||||
// await importGanacheSeedPhrase(f, account2, password)
|
||||
// })
|
||||
|
||||
describe('RSK network tests', async () => {
|
||||
await RSKNetworkTests(f, account1)
|
||||
})
|
||||
// describe('RSK network tests', async () => {
|
||||
// await RSKNetworkTests(f, account1RSK)
|
||||
// })
|
||||
|
||||
describe('Check the filter of emitted events', async () => {
|
||||
await checkEmittedEvents(f, account1, account2)
|
||||
})
|
||||
// describe('Check the filter of emitted events', async () => {
|
||||
// await checkEmittedEvents(f, account1, account2)
|
||||
// })
|
||||
|
||||
// todo: it works locally, but doesn't work in CI
|
||||
// describe('Add Token: Custom', async () => {
|
||||
// await addCustomToken(f, account1, account2)
|
||||
// })
|
||||
// // todo: it works locally, but doesn't work in CI
|
||||
// // describe('Add Token: Custom', async () => {
|
||||
// // await addCustomToken(f, account1, account2)
|
||||
// // })
|
||||
|
||||
describe('Change password', async () => {
|
||||
await changePassword(f, password, newPassword)
|
||||
})
|
||||
// describe('Change password', async () => {
|
||||
// await changePassword(f, password, newPassword)
|
||||
// })
|
||||
|
||||
describe('Add Token:Search', async () => {
|
||||
await addTokeFromSearch(f)
|
||||
})
|
||||
// describe('Add Token:Search', async () => {
|
||||
// await addTokeFromSearch(f)
|
||||
// })
|
||||
|
||||
describe('Custom Rpc', async () => {
|
||||
await customRPC(f)
|
||||
})
|
||||
})
|
||||
// describe('Custom RPC', async () => {
|
||||
// await customRPC(f)
|
||||
// })
|
||||
// })
|
||||
|
||||
|
||||
|
|
|
@ -1,90 +1,90 @@
|
|||
// const assert = require('assert')
|
||||
// const { screens, elements, NETWORKS } = require('../elements')
|
||||
const assert = require('assert')
|
||||
const { screens, elements, NETWORKS } = require('../elements')
|
||||
|
||||
const RSKNetworkTests = async (f, account1) => {
|
||||
// it('connects to RSK mainnet', async function () {
|
||||
// await f.setProvider(NETWORKS.RSK)
|
||||
// await f.delay(2000)
|
||||
// })
|
||||
it('connects to RSK mainnet', async function () {
|
||||
await f.setProvider(NETWORKS.RSK)
|
||||
await f.delay(2000)
|
||||
})
|
||||
|
||||
// it('connects to RSK testnet', async function () {
|
||||
// await f.setProvider(NETWORKS.RSK_TESTNET)
|
||||
// await f.delay(2000)
|
||||
// })
|
||||
it('connects to RSK testnet', async function () {
|
||||
await f.setProvider(NETWORKS.RSK_TESTNET)
|
||||
await f.delay(2000)
|
||||
})
|
||||
|
||||
// it('checks zero exchange rate for RSK testnet', async function () {
|
||||
// const balanceField = await f.waitUntilShowUp(screens.main.balance)
|
||||
// const balanceUSDField = await f.waitUntilShowUp(screens.main.balanceUSD)
|
||||
// await f.delay(2000)
|
||||
// const balance = await balanceField.getText()
|
||||
// const balanceUSD = await balanceUSDField.getText()
|
||||
// console.log('Balance = ' + parseFloat(balance))
|
||||
// console.log('balanceUSD = ' + parseFloat(balanceUSD))
|
||||
// assert.equal(parseFloat(balance) > 0.0001, true, 'Balance of account ' + account1 + ' is TOO LOW in RSK testnet !!! Please refill it!!!!')
|
||||
// assert.equal(parseFloat(balanceUSD), 0, 'USD balance of account is not zero')
|
||||
// })
|
||||
it('checks zero exchange rate for RSK testnet', async function () {
|
||||
const balanceField = await f.waitUntilShowUp(screens.main.balance)
|
||||
const balanceUSDField = await f.waitUntilShowUp(screens.main.balanceUSD)
|
||||
await f.delay(2000)
|
||||
const balance = await balanceField.getText()
|
||||
const balanceUSD = await balanceUSDField.getText()
|
||||
console.log('Balance = ' + parseFloat(balance))
|
||||
console.log('balanceUSD = ' + parseFloat(balanceUSD))
|
||||
assert.equal(parseFloat(balance) > 0.0001, true, 'Balance of account ' + account1 + ' is TOO LOW in RSK testnet !!! Please refill it!!!!')
|
||||
assert.equal(parseFloat(balanceUSD), 0, 'USD balance of account is not zero')
|
||||
})
|
||||
|
||||
// it('opens RSK faucet', async function () {
|
||||
// await f.waitUntilShowUp(screens.main.buttons.buyRSK)
|
||||
// const buttons = await f.driver.findElements(screens.main.buttons.buyRSK)
|
||||
// assert.equal(buttons.length, 1, 'main screen isn\'t displayed')
|
||||
// const buyButton = buttons[0]
|
||||
// const buyButtonText = await buyButton.getText()
|
||||
// assert.equal(buyButtonText, 'Buy', 'button has incorrect name')
|
||||
// await buyButton.click()
|
||||
// await f.delay(2000)
|
||||
// const title = await f.waitUntilShowUp(screens.buyEther.title)
|
||||
// assert.equal(await title.getText(), 'Buy RBTC', "screen 'Buy RBTC' has incorrect title text")
|
||||
// await f.waitUntilShowUp(screens.buyEther.faucetLinkRSK)
|
||||
// const faucetButtons = await f.driver.findElements(screens.buyEther.faucetLinkRSK)
|
||||
// assert.equal(faucetButtons.length, 1, 'there is no faucet button on the screen')
|
||||
// const faucetLinkButton = faucetButtons[0]
|
||||
// assert.equal(await faucetLinkButton.getText(), 'RSK Testnet Test Faucet', "screen 'Buy RSK' has incorrect name for faucet link")
|
||||
// await faucetLinkButton.click()
|
||||
// await f.delay(3000)
|
||||
// const [tab0, tab1] = await f.driver.getAllWindowHandles()
|
||||
// await f.driver.switchTo().window(tab1)
|
||||
// const faucetLink = await f.driver.getCurrentUrl()
|
||||
// assert.equal(faucetLink, 'https://faucet.testnet.rsk.co/', 'Incorrect faucet link for RSK network')
|
||||
// await f.driver.close()
|
||||
// await f.driver.switchTo().window(tab0)
|
||||
// const arrow = await f.waitUntilShowUp(elements.buttonArrow)
|
||||
// await arrow.click()
|
||||
// await f.delay(2000)
|
||||
// })
|
||||
it('opens RSK faucet', async function () {
|
||||
await f.waitUntilShowUp(screens.main.buttons.buyRSK)
|
||||
const buttons = await f.driver.findElements(screens.main.buttons.buyRSK)
|
||||
assert.equal(buttons.length, 1, 'main screen isn\'t displayed')
|
||||
const buyButton = buttons[0]
|
||||
const buyButtonText = await buyButton.getText()
|
||||
assert.equal(buyButtonText, 'Buy', 'button has incorrect name')
|
||||
await buyButton.click()
|
||||
await f.delay(2000)
|
||||
const title = await f.waitUntilShowUp(screens.buyEther.title)
|
||||
assert.equal(await title.getText(), 'Buy RBTC', "screen 'Buy RBTC' has incorrect title text")
|
||||
await f.waitUntilShowUp(screens.buyEther.faucetLinkRSK)
|
||||
const faucetButtons = await f.driver.findElements(screens.buyEther.faucetLinkRSK)
|
||||
assert.equal(faucetButtons.length, 1, 'there is no faucet button on the screen')
|
||||
const faucetLinkButton = faucetButtons[0]
|
||||
assert.equal(await faucetLinkButton.getText(), 'RSK Testnet Test Faucet', "screen 'Buy RSK' has incorrect name for faucet link")
|
||||
await faucetLinkButton.click()
|
||||
await f.delay(3000)
|
||||
const [tab0, tab1] = await f.driver.getAllWindowHandles()
|
||||
await f.driver.switchTo().window(tab1)
|
||||
const faucetLink = await f.driver.getCurrentUrl()
|
||||
assert.equal(faucetLink, 'https://faucet.testnet.rsk.co/', 'Incorrect faucet link for RSK network')
|
||||
await f.driver.close()
|
||||
await f.driver.switchTo().window(tab0)
|
||||
const arrow = await f.waitUntilShowUp(elements.buttonArrow)
|
||||
await arrow.click()
|
||||
await f.delay(2000)
|
||||
})
|
||||
|
||||
// it('opens send transaction screen', async function () {
|
||||
// const sendButton = await f.waitUntilShowUp(screens.main.buttons.sendRSK)
|
||||
// assert.equal(await sendButton.getText(), screens.main.buttons.sendText)
|
||||
// await f.click(sendButton)
|
||||
// })
|
||||
it('opens send transaction screen', async function () {
|
||||
const sendButton = await f.waitUntilShowUp(screens.main.buttons.sendRSK)
|
||||
assert.equal(await sendButton.getText(), screens.main.buttons.sendText)
|
||||
await f.click(sendButton)
|
||||
})
|
||||
|
||||
// it('adds recipient address and amount', async function () {
|
||||
// const sendTranscationScreen = await f.waitUntilShowUp(screens.sendTransaction.title)
|
||||
// assert.equal(await sendTranscationScreen.getText(), screens.sendTransaction.titleText, 'Transaction screen has incorrect titlr')
|
||||
// const inputAddress = await f.waitUntilShowUp(screens.sendTransaction.field.address)
|
||||
// const inputAmmount = await f.waitUntilShowUp(screens.sendTransaction.field.amount)
|
||||
// await inputAddress.sendKeys(account1)
|
||||
// await f.clearField(inputAmmount)
|
||||
// await inputAmmount.sendKeys('0.000001')
|
||||
// const button = await f.waitUntilShowUp(screens.sendTransaction.buttonNext)
|
||||
// assert.equal(await button.getText(), 'Next', 'button has incorrect name')
|
||||
// await f.click(button)
|
||||
// })
|
||||
it('adds recipient address and amount', async function () {
|
||||
const sendTranscationScreen = await f.waitUntilShowUp(screens.sendTransaction.title)
|
||||
assert.equal(await sendTranscationScreen.getText(), screens.sendTransaction.titleText, 'Transaction screen has incorrect titlr')
|
||||
const inputAddress = await f.waitUntilShowUp(screens.sendTransaction.field.address)
|
||||
const inputAmmount = await f.waitUntilShowUp(screens.sendTransaction.field.amount)
|
||||
await inputAddress.sendKeys(account1)
|
||||
await f.clearField(inputAmmount)
|
||||
await inputAmmount.sendKeys('0.000001')
|
||||
const button = await f.waitUntilShowUp(screens.sendTransaction.buttonNext)
|
||||
assert.equal(await button.getText(), 'Next', 'button has incorrect name')
|
||||
await f.click(button)
|
||||
})
|
||||
|
||||
// it('confirms transaction', async function () {
|
||||
// const inputGasLimit = await f.waitUntilShowUp(screens.confirmTransaction.fields.gasLimit)
|
||||
// await f.clearField(inputGasLimit)
|
||||
// await inputGasLimit.sendKeys('21000')
|
||||
// const button = await f.waitUntilShowUp(screens.confirmTransaction.button.submit)
|
||||
// assert.equal(await button.getAttribute('value'), 'Submit', 'button has incorrect name')
|
||||
// await f.click(button)
|
||||
// })
|
||||
it('confirms transaction', async function () {
|
||||
const inputGasLimit = await f.waitUntilShowUp(screens.confirmTransaction.fields.gasLimit)
|
||||
await f.clearField(inputGasLimit)
|
||||
await inputGasLimit.sendKeys('21000')
|
||||
const button = await f.waitUntilShowUp(screens.confirmTransaction.button.submit)
|
||||
assert.equal(await button.getAttribute('value'), 'Submit', 'button has incorrect name')
|
||||
await f.click(button)
|
||||
})
|
||||
|
||||
// it('finds the transaction in the transactions list', async function () {
|
||||
// const transactionAmount = await f.waitUntilShowUp(screens.main.transactionList)
|
||||
// assert.equal(await transactionAmount.getText(), '<0.001')
|
||||
// })
|
||||
it('finds the transaction in the transactions list', async function () {
|
||||
const transactionAmount = await f.waitUntilShowUp(screens.main.transactionList)
|
||||
assert.equal(await transactionAmount.getText(), '<0.001')
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = RSKNetworkTests
|
||||
|
|
|
@ -47,7 +47,7 @@ describe('# Network Controller', function () {
|
|||
|
||||
describe('#setNetworkState', function () {
|
||||
it('should update the network', function () {
|
||||
networkController.setNetworkState(1)
|
||||
networkController.setNetworkState(1, 'mainnet')
|
||||
const networkState = networkController.getNetworkState()
|
||||
assert.equal(networkState, 1, 'network is 1')
|
||||
})
|
||||
|
|
|
@ -14,9 +14,12 @@ const {
|
|||
normalizeNumberToWei,
|
||||
isHex,
|
||||
ifRSK,
|
||||
ifRSKByProviderType,
|
||||
ifPOA,
|
||||
toChecksumAddress,
|
||||
isValidChecksumAddress,
|
||||
isInfuraProvider,
|
||||
isKnownProvider,
|
||||
} = require('../../../../old-ui/app/util')
|
||||
const ethUtil = require('ethereumjs-util')
|
||||
let ethInWei = '1'
|
||||
|
@ -336,30 +339,29 @@ describe('normalizing values', function () {
|
|||
|
||||
describe('#ifRSK', function () {
|
||||
it('checks if this is RSK chain', function () {
|
||||
var result1 = ifRSK(30)
|
||||
assert(result1)
|
||||
var result2 = ifRSK(31)
|
||||
assert(result2)
|
||||
var result3 = ifRSK(1)
|
||||
assert(!result3)
|
||||
var result4 = ifRSK()
|
||||
assert(!result4)
|
||||
assert(ifRSK(30))
|
||||
assert(ifRSK(31))
|
||||
assert(!ifRSK(1))
|
||||
assert(!ifRSK())
|
||||
})
|
||||
})
|
||||
|
||||
describe('#ifRSKByProviderType', function () {
|
||||
it('checks if this is RSK chain based on provider type', function () {
|
||||
assert(ifRSKByProviderType('rsk'))
|
||||
assert(ifRSKByProviderType('rsk_testnet'))
|
||||
assert(!ifRSKByProviderType('mainnet'))
|
||||
assert(!ifRSKByProviderType())
|
||||
})
|
||||
})
|
||||
|
||||
describe('#ifPOA', function () {
|
||||
it('checks if this is POA chain', function () {
|
||||
var resultSokol = ifPOA(77)
|
||||
assert(resultSokol)
|
||||
var resultCore = ifPOA(99)
|
||||
assert(resultCore)
|
||||
var resultXDai = ifPOA(100)
|
||||
assert(resultXDai)
|
||||
var resultMainnet = ifPOA(1)
|
||||
assert(!resultMainnet)
|
||||
var result4 = ifPOA()
|
||||
assert(!result4)
|
||||
assert(ifPOA(77))
|
||||
assert(ifPOA(99))
|
||||
assert(ifPOA(100))
|
||||
assert(!ifPOA(1))
|
||||
assert(!ifPOA())
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -380,12 +382,36 @@ describe('normalizing values', function () {
|
|||
|
||||
describe('#isValidChecksumAddress', function () {
|
||||
it('checks if is valid checksum address', function () {
|
||||
var resultMainnet = isValidChecksumAddress('30', addrRSKMainnet)
|
||||
assert(resultMainnet)
|
||||
var resultTestnet = isValidChecksumAddress('31', addrRSKTestnet)
|
||||
assert(resultTestnet)
|
||||
var resultNotRSK = isValidChecksumAddress('1', addrETHMainnet)
|
||||
assert(resultNotRSK)
|
||||
assert(isValidChecksumAddress('30', addrRSKMainnet))
|
||||
assert(isValidChecksumAddress('31', addrRSKTestnet))
|
||||
assert(isValidChecksumAddress('1', addrETHMainnet))
|
||||
})
|
||||
})
|
||||
|
||||
describe('#isInfuraProvider', function () {
|
||||
it('checks, that the given provider is Infura provider', function () {
|
||||
assert(isInfuraProvider('kovan'))
|
||||
assert(isInfuraProvider('ropsten'))
|
||||
assert(isInfuraProvider('rinkeby'))
|
||||
assert(isInfuraProvider('mainnet'))
|
||||
assert(!isInfuraProvider('goerli_testnet'))
|
||||
assert(!isInfuraProvider('sokol'))
|
||||
assert(!isInfuraProvider('classic'))
|
||||
assert(!isInfuraProvider('rsk'))
|
||||
})
|
||||
})
|
||||
|
||||
describe('#isKnownProvider', function () {
|
||||
it('checks, that the given provider is Infura provider', function () {
|
||||
assert(isKnownProvider('kovan'))
|
||||
assert(isKnownProvider('ropsten'))
|
||||
assert(isKnownProvider('rinkeby'))
|
||||
assert(isKnownProvider('mainnet'))
|
||||
assert(isKnownProvider('goerli_testnet'))
|
||||
assert(isKnownProvider('sokol'))
|
||||
assert(isKnownProvider('classic'))
|
||||
assert(isKnownProvider('rsk'))
|
||||
assert(!isKnownProvider('unknown_network'))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
|
@ -319,6 +319,10 @@ var actions = {
|
|||
SET_USE_BLOCKIE: 'SET_USE_BLOCKIE',
|
||||
setUseBlockie,
|
||||
|
||||
// DProvider
|
||||
SET_DPROVIDER: 'SET_DPROVIDER',
|
||||
setDProvider,
|
||||
|
||||
// locale
|
||||
SET_CURRENT_LOCALE: 'SET_CURRENT_LOCALE',
|
||||
SET_LOCALE_MESSAGES: 'SET_LOCALE_MESSAGES',
|
||||
|
@ -2648,6 +2652,23 @@ function updateCurrentLocale (key) {
|
|||
}
|
||||
}
|
||||
|
||||
function setDProvider (val) {
|
||||
return (dispatch) => {
|
||||
dispatch(actions.showLoadingIndication())
|
||||
log.debug(`background.setDProvider`)
|
||||
background.setDProvider(val, (err) => {
|
||||
dispatch(actions.hideLoadingIndication())
|
||||
if (err) {
|
||||
return dispatch(actions.displayWarning(err.message))
|
||||
}
|
||||
})
|
||||
dispatch({
|
||||
type: actions.SET_DPROVIDER,
|
||||
value: val,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function setCurrentLocale (key) {
|
||||
return {
|
||||
type: actions.SET_CURRENT_LOCALE,
|
||||
|
|
|
@ -352,6 +352,13 @@ function reduceMetamask (state, action) {
|
|||
welcomeScreenSeen: true,
|
||||
})
|
||||
|
||||
case actions.SET_DPROVIDER:
|
||||
return extend(metamaskState, {
|
||||
dProviderStore: {
|
||||
dProvider: action.value,
|
||||
},
|
||||
})
|
||||
|
||||
case actions.SET_CURRENT_LOCALE:
|
||||
return extend(metamaskState, {
|
||||
currentLocale: action.value,
|
||||
|
|
Loading…
Reference in New Issue