Fix gas estimation
This commit is contained in:
commit
1a1b4dd408
|
@ -2,9 +2,12 @@ const mergeMiddleware = require('json-rpc-engine/src/mergeMiddleware')
|
||||||
const createFetchMiddleware = require('eth-json-rpc-middleware/fetch')
|
const createFetchMiddleware = require('eth-json-rpc-middleware/fetch')
|
||||||
const createBlockRefRewriteMiddleware = require('eth-json-rpc-middleware/block-ref-rewrite')
|
const createBlockRefRewriteMiddleware = require('eth-json-rpc-middleware/block-ref-rewrite')
|
||||||
const createBlockTrackerInspectorMiddleware = require('eth-json-rpc-middleware/block-tracker-inspector')
|
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 providerFromMiddleware = require('eth-json-rpc-middleware/providerFromMiddleware')
|
||||||
const BlockTracker = require('eth-block-tracker')
|
const BlockTracker = require('eth-block-tracker')
|
||||||
|
|
||||||
|
const inTest = process.env.IN_TEST === 'true'
|
||||||
|
|
||||||
module.exports = createLocalhostClient
|
module.exports = createLocalhostClient
|
||||||
|
|
||||||
function createLocalhostClient () {
|
function createLocalhostClient () {
|
||||||
|
@ -13,9 +16,24 @@ function createLocalhostClient () {
|
||||||
const blockTracker = new BlockTracker({ provider: blockProvider, pollingInterval: 1000 })
|
const blockTracker = new BlockTracker({ provider: blockProvider, pollingInterval: 1000 })
|
||||||
|
|
||||||
const networkMiddleware = mergeMiddleware([
|
const networkMiddleware = mergeMiddleware([
|
||||||
|
createEstimateGasMiddleware(),
|
||||||
createBlockRefRewriteMiddleware({ blockTracker }),
|
createBlockRefRewriteMiddleware({ blockTracker }),
|
||||||
createBlockTrackerInspectorMiddleware({ blockTracker }),
|
createBlockTrackerInspectorMiddleware({ blockTracker }),
|
||||||
fetchMiddleware,
|
fetchMiddleware,
|
||||||
])
|
])
|
||||||
return { networkMiddleware, blockTracker }
|
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()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -102,7 +102,7 @@ function getNetworkIds ({ network }) {
|
||||||
ticker = POA_TICK
|
ticker = POA_TICK
|
||||||
break
|
break
|
||||||
case POA_SOKOL:
|
case POA_SOKOL:
|
||||||
netId= POA_SOKOL_CODE.toString()
|
netId = POA_SOKOL_CODE.toString()
|
||||||
chainId = POA_SOKOL_CHAINID
|
chainId = POA_SOKOL_CHAINID
|
||||||
ticker = POA_TICK
|
ticker = POA_TICK
|
||||||
break
|
break
|
||||||
|
@ -110,7 +110,7 @@ function getNetworkIds ({ network }) {
|
||||||
throw new Error(`createPocketClient - unknown network "${network}"`)
|
throw new Error(`createPocketClient - unknown network "${network}"`)
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
chainId, netId, ticker
|
chainId, netId, ticker,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,17 +11,17 @@ const RSK = 'rsk'
|
||||||
const RSK_TESTNET = 'rsk_testnet'
|
const RSK_TESTNET = 'rsk_testnet'
|
||||||
const LOCALHOST = 'localhost'
|
const LOCALHOST = 'localhost'
|
||||||
|
|
||||||
const ETH_TICK = "ETH"
|
const ETH_TICK = 'ETH'
|
||||||
const POA_TICK = "POA"
|
const POA_TICK = 'POA'
|
||||||
|
|
||||||
const MAINNET_CHAINID = "0X01"
|
const MAINNET_CHAINID = '0X01'
|
||||||
const ROPSTEN_CHAINID = "0x03"
|
const ROPSTEN_CHAINID = '0x03'
|
||||||
const RINKEBY_CHAINID = "0x04"
|
const RINKEBY_CHAINID = '0x04'
|
||||||
const KOVAN_CHAINID = "0x2a"
|
const KOVAN_CHAINID = '0x2a'
|
||||||
const GOERLI_TESTNET_CHAINID = "0X5"
|
const GOERLI_TESTNET_CHAINID = '0X5'
|
||||||
const POA_CHAINID = "0x63"
|
const POA_CHAINID = '0x63'
|
||||||
const DAI_CHAINID = "0x64"
|
const DAI_CHAINID = '0x64'
|
||||||
const POA_SOKOL_CHAINID = "0x4D"
|
const POA_SOKOL_CHAINID = '0x4D'
|
||||||
|
|
||||||
const POA_CODE = 99
|
const POA_CODE = 99
|
||||||
const DAI_CODE = 100
|
const DAI_CODE = 100
|
||||||
|
|
|
@ -14,6 +14,9 @@ const createPocketClient = require('./createPocketClient')
|
||||||
const { createSwappableProxy, createEventEmitterProxy } = require('swappable-obj-proxy')
|
const { createSwappableProxy, createEventEmitterProxy } = require('swappable-obj-proxy')
|
||||||
const ethNetProps = require('eth-net-props')
|
const ethNetProps = require('eth-net-props')
|
||||||
const parse = require('url-parse')
|
const parse = require('url-parse')
|
||||||
|
const extend = require('extend')
|
||||||
|
const networks = { networkList: {} }
|
||||||
|
const { isKnownProvider } = require('../../../../old-ui/app/util')
|
||||||
|
|
||||||
const {
|
const {
|
||||||
ROPSTEN,
|
ROPSTEN,
|
||||||
|
@ -43,8 +46,21 @@ const env = process.env.METAMASK_ENV
|
||||||
const METAMASK_DEBUG = process.env.METAMASK_DEBUG
|
const METAMASK_DEBUG = process.env.METAMASK_DEBUG
|
||||||
const testMode = (METAMASK_DEBUG || env === 'test')
|
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 = {
|
const defaultProviderConfig = {
|
||||||
type: testMode ? POA_SOKOL : POA,
|
type: defaultProviderConfigType,
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultNetworkConfig = {
|
||||||
|
ticker: 'POA',
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = class NetworkController extends EventEmitter {
|
module.exports = class NetworkController extends EventEmitter {
|
||||||
|
@ -58,6 +74,7 @@ module.exports = class NetworkController extends EventEmitter {
|
||||||
this.providerStore = new ObservableStore(providerConfig)
|
this.providerStore = new ObservableStore(providerConfig)
|
||||||
this.networkStore = new ObservableStore('loading')
|
this.networkStore = new ObservableStore('loading')
|
||||||
this.dProviderStore = new ObservableStore({dProvider: false})
|
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.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore, dProviderStore: this.dProviderStore })
|
||||||
this.on('networkDidChange', this.lookupNetwork)
|
this.on('networkDidChange', this.lookupNetwork)
|
||||||
// provider and block tracker
|
// provider and block tracker
|
||||||
|
@ -70,8 +87,8 @@ module.exports = class NetworkController extends EventEmitter {
|
||||||
|
|
||||||
initializeProvider (providerParams) {
|
initializeProvider (providerParams) {
|
||||||
this._baseProviderParams = providerParams
|
this._baseProviderParams = providerParams
|
||||||
const { type, rpcTarget } = this.providerStore.getState()
|
const { type, rpcTarget, chainId, ticker, nickname } = this.providerStore.getState()
|
||||||
this._configureProvider({ type, rpcTarget })
|
this._configureProvider({ type, rpcTarget, chainId, ticker, nickname })
|
||||||
this.lookupNetwork()
|
this.lookupNetwork()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +108,20 @@ module.exports = class NetworkController extends EventEmitter {
|
||||||
return this.networkStore.getState()
|
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)
|
return this.networkStore.putState(network)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,45 +130,46 @@ module.exports = class NetworkController extends EventEmitter {
|
||||||
}
|
}
|
||||||
|
|
||||||
lookupNetwork () {
|
lookupNetwork () {
|
||||||
const { type, rpcTarget } = this.providerStore.getState()
|
|
||||||
// Prevent firing when provider is not defined.
|
// Prevent firing when provider is not defined.
|
||||||
if (!this._provider) {
|
if (!this._provider) {
|
||||||
return log.warn('NetworkController - lookupNetwork aborted due to missing provider')
|
return log.warn('NetworkController - lookupNetwork aborted due to missing provider')
|
||||||
}
|
}
|
||||||
|
const { type, rpcTarget } = this.providerStore.getState()
|
||||||
const ethQuery = new EthQuery(this._provider)
|
const ethQuery = new EthQuery(this._provider)
|
||||||
|
const initialNetwork = this.getNetworkState()
|
||||||
ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
|
ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
|
||||||
if (err) return this.setNetworkState('loading')
|
|
||||||
const targetHost = parse(rpcTarget, true).host
|
const targetHost = parse(rpcTarget, true).host
|
||||||
const classicHost = parse(ethNetProps.RPCEndpoints(CLASSIC_CODE)[0], true).host
|
const classicHost = parse(ethNetProps.RPCEndpoints(CLASSIC_CODE)[0], true).host
|
||||||
if (type === CLASSIC || targetHost === classicHost) {
|
if (type === CLASSIC || targetHost === classicHost) {
|
||||||
network = CLASSIC_CODE.toString()
|
network = CLASSIC_CODE.toString()
|
||||||
} // workaround to avoid Mainnet and Classic are having the same network ID
|
} // workaround to avoid Mainnet and Classic are having the same network ID
|
||||||
log.info('web3.getNetwork returned ' + network)
|
const currentNetwork = this.getNetworkState()
|
||||||
this.setNetworkState(network)
|
if (initialNetwork === currentNetwork) {
|
||||||
|
if (err) {
|
||||||
|
return this.setNetworkState('loading')
|
||||||
|
}
|
||||||
|
log.info('web3.getNetwork returned ' + network)
|
||||||
|
this.setNetworkState(network, type)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
setRpcTarget (rpcTarget) {
|
setRpcTarget (rpcTarget, chainId, ticker = 'ETH', nickname = '', rpcPrefs) {
|
||||||
const providerConfig = {
|
const providerConfig = {
|
||||||
type: 'rpc',
|
type: 'rpc',
|
||||||
rpcTarget,
|
rpcTarget,
|
||||||
|
chainId,
|
||||||
|
ticker,
|
||||||
|
nickname,
|
||||||
|
rpcPrefs,
|
||||||
}
|
}
|
||||||
this.providerConfig = providerConfig
|
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.notEqual(type, 'rpc', `NetworkController - cannot call "setProviderType" with type 'rpc'. use "setRpcTarget"`)
|
||||||
assert(INFURA_PROVIDER_TYPES.includes(type) ||
|
assert(isKnownProvider(type), `NetworkController - Unknown rpc type "${type}"`)
|
||||||
type === LOCALHOST ||
|
const providerConfig = { type, rpcTarget, ticker, nickname }
|
||||||
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 }
|
|
||||||
this.providerConfig = providerConfig
|
this.providerConfig = providerConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,11 +186,11 @@ module.exports = class NetworkController extends EventEmitter {
|
||||||
return this.providerStore.getState()
|
return this.providerStore.getState()
|
||||||
}
|
}
|
||||||
|
|
||||||
getDProvider(){
|
getDProvider () {
|
||||||
return this.dProviderStore.getState().dProvider
|
return this.dProviderStore.getState().dProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
setDProvider(key){
|
setDProvider (key) {
|
||||||
this.dProviderStore.updateState({
|
this.dProviderStore.updateState({
|
||||||
dProvider: key,
|
dProvider: key,
|
||||||
})
|
})
|
||||||
|
@ -172,46 +203,46 @@ module.exports = class NetworkController extends EventEmitter {
|
||||||
_switchNetwork (opts) {
|
_switchNetwork (opts) {
|
||||||
this.setNetworkState('loading')
|
this.setNetworkState('loading')
|
||||||
this._configureProvider(opts)
|
this._configureProvider(opts)
|
||||||
this.emit('networkDidChange')
|
this.emit('networkDidChange', opts.type)
|
||||||
}
|
}
|
||||||
|
|
||||||
_configureProvider (opts) {
|
_configureProvider (opts) {
|
||||||
const { type, rpcTarget } = opts
|
const { type, rpcTarget, chainId, ticker, nickname } = opts
|
||||||
// infura type-based endpoints
|
// infura type-based endpoints
|
||||||
const isInfura = INFURA_PROVIDER_TYPES.includes(type)
|
const isInfura = INFURA_PROVIDER_TYPES.includes(type)
|
||||||
// pocket type-based endpointes
|
// pocket type-based endpointes
|
||||||
const isPocket = POCKET_PROVIDER_TYPES.includes(type)
|
const isPocket = POCKET_PROVIDER_TYPES.includes(type)
|
||||||
|
|
||||||
if (!isPocket && this.dProviderStore.getState().dProvider){
|
if (!isPocket && this.dProviderStore.getState().dProvider) {
|
||||||
this.dProviderStore.updateState({
|
this.dProviderStore.updateState({
|
||||||
dProvider: false
|
dProvider: false,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPocket && this.dProviderStore.getState().dProvider){
|
if (isPocket && this.dProviderStore.getState().dProvider) {
|
||||||
this._configurePocketProvider(opts)
|
this._configurePocketProvider(opts)
|
||||||
} else if (isInfura) {
|
} else if (isInfura) {
|
||||||
this._configureInfuraProvider(opts)
|
this._configureInfuraProvider(opts)
|
||||||
// other type-based rpc endpoints
|
// other type-based rpc endpoints
|
||||||
} else if (type === POA) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} else if (type === LOCALHOST) {
|
||||||
this._configureLocalhostProvider()
|
this._configureLocalhostProvider()
|
||||||
// url-based rpc endpoints
|
// url-based rpc endpoints
|
||||||
} else if (type === 'rpc') {
|
} else if (type === 'rpc') {
|
||||||
this._configureStandardProvider({ rpcUrl: rpcTarget })
|
this._configureStandardProvider({ rpcUrl: rpcTarget, chainId, ticker, nickname })
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`NetworkController - _configureProvider - unknown type "${type}"`)
|
throw new Error(`NetworkController - _configureProvider - unknown type "${type}"`)
|
||||||
}
|
}
|
||||||
|
@ -221,6 +252,11 @@ module.exports = class NetworkController extends EventEmitter {
|
||||||
log.info('NetworkController - configureInfuraProvider', type)
|
log.info('NetworkController - configureInfuraProvider', type)
|
||||||
const networkClient = createInfuraClient({ network: type })
|
const networkClient = createInfuraClient({ network: type })
|
||||||
this._setNetworkClient(networkClient)
|
this._setNetworkClient(networkClient)
|
||||||
|
// setup networkConfig
|
||||||
|
var settings = {
|
||||||
|
ticker: 'ETH',
|
||||||
|
}
|
||||||
|
this.networkConfig.putState(settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
_configurePocketProvider ({ type }) {
|
_configurePocketProvider ({ type }) {
|
||||||
|
@ -235,9 +271,22 @@ module.exports = class NetworkController extends EventEmitter {
|
||||||
this._setNetworkClient(networkClient)
|
this._setNetworkClient(networkClient)
|
||||||
}
|
}
|
||||||
|
|
||||||
_configureStandardProvider ({ rpcUrl }) {
|
_configureStandardProvider ({ rpcUrl, chainId, ticker, nickname }) {
|
||||||
log.info('NetworkController - configureStandardProvider', rpcUrl)
|
log.info('NetworkController - configureStandardProvider', rpcUrl)
|
||||||
const networkClient = createJsonRpcClient({ 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)
|
this._setNetworkClient(networkClient)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@ const extend = require('xtend')
|
||||||
const EthQuery = require('eth-query')
|
const EthQuery = require('eth-query')
|
||||||
const log = require('loglevel')
|
const log = require('loglevel')
|
||||||
const pify = require('pify')
|
const pify = require('pify')
|
||||||
|
const { isKnownProvider, ifRSKByProviderType } = require('../../../old-ui/app/util')
|
||||||
|
|
||||||
|
|
||||||
class RecentBlocksController {
|
class RecentBlocksController {
|
||||||
|
|
||||||
|
@ -24,26 +26,58 @@ class RecentBlocksController {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
constructor (opts = {}) {
|
constructor (opts = {}) {
|
||||||
const { blockTracker, provider } = opts
|
const { blockTracker, provider, networkController } = opts
|
||||||
|
const { type } = networkController.getProviderConfig()
|
||||||
this.blockTracker = blockTracker
|
this.blockTracker = blockTracker
|
||||||
this.ethQuery = new EthQuery(provider)
|
this.ethQuery = new EthQuery(provider)
|
||||||
this.historyLength = opts.historyLength || 40
|
this.setHistoryLength(type, opts)
|
||||||
|
|
||||||
const initState = extend({
|
const initState = extend({
|
||||||
recentBlocks: [],
|
recentBlocks: [],
|
||||||
}, opts.initState)
|
}, opts.initState)
|
||||||
this.store = new ObservableStore(initState)
|
this.store = new ObservableStore(initState)
|
||||||
|
const blockListner = async (newBlockNumberHex) => {
|
||||||
this.blockTracker.on('latest', async (newBlockNumberHex) => {
|
|
||||||
try {
|
try {
|
||||||
await this.processBlock(newBlockNumberHex)
|
await this.processBlock(newBlockNumberHex)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log.error(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()
|
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
|
* Sets store.recentBlocks to an empty array
|
||||||
*
|
*
|
||||||
|
|
|
@ -130,6 +130,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
||||||
this.recentBlocksController = new RecentBlocksController({
|
this.recentBlocksController = new RecentBlocksController({
|
||||||
blockTracker: this.blockTracker,
|
blockTracker: this.blockTracker,
|
||||||
provider: this.provider,
|
provider: this.provider,
|
||||||
|
networkController: this.networkController,
|
||||||
})
|
})
|
||||||
|
|
||||||
// account tracker watches balances, nonces, and any code at their address.
|
// account tracker watches balances, nonces, and any code at their address.
|
||||||
|
|
|
@ -70,8 +70,8 @@ class NetworksMenu extends Component {
|
||||||
key={'default'}
|
key={'default'}
|
||||||
closeMenu={() => this.props.updateNetworksMenuOpenState(!isOpen)}
|
closeMenu={() => this.props.updateNetworksMenuOpenState(!isOpen)}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
props.setRpcTarget('http://localhost:8545')
|
props.setProviderType(LOCALHOST, LOCALHOST_RPC_URL)
|
||||||
props.setProviderType(LOCALHOST)
|
props.setRpcTarget(LOCALHOST_RPC_URL)
|
||||||
}}
|
}}
|
||||||
style={{
|
style={{
|
||||||
paddingLeft: '20px',
|
paddingLeft: '20px',
|
||||||
|
|
|
@ -31,12 +31,13 @@ class ConfigScreen extends Component {
|
||||||
super(props)
|
super(props)
|
||||||
this.state = {
|
this.state = {
|
||||||
loading: false,
|
loading: false,
|
||||||
dProvider: props.metamask.dProviderStore.dProvider
|
dProvider: props.metamask.dProviderStore.dProvider,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
dispatch: PropTypes.func,
|
dispatch: PropTypes.func,
|
||||||
|
metamask: PropTypes.object,
|
||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
|
@ -44,9 +45,9 @@ class ConfigScreen extends Component {
|
||||||
const metamaskState = state.metamask
|
const metamaskState = state.metamask
|
||||||
const warning = state.warning
|
const warning = state.warning
|
||||||
|
|
||||||
if(state.metamask.dProviderStore.dProvider != this.state.dProvider){
|
if (state.metamask.dProviderStore.dProvider !== this.state.dProvider) {
|
||||||
this.setState({
|
this.setState({
|
||||||
dProvider: this.props.metamask.dProviderStore.dProvider
|
dProvider: this.props.metamask.dProviderStore.dProvider,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +174,31 @@ class ConfigScreen extends Component {
|
||||||
}, 'Reveal Seed Words'),
|
}, 'Reveal Seed Words'),
|
||||||
]),
|
]),
|
||||||
|
|
||||||
h('hr.horizontal-line'),
|
h('hr.horizontal-line', {
|
||||||
|
style: {
|
||||||
|
marginTop: '20px',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
|
||||||
|
h('p', {
|
||||||
|
style: {
|
||||||
|
fontFamily: 'Nunito Regular',
|
||||||
|
fontSize: '14px',
|
||||||
|
lineHeight: '18px',
|
||||||
|
},
|
||||||
|
}, [
|
||||||
|
'Switch to Decentralized Provider (Pocket)',
|
||||||
|
]),
|
||||||
|
|
||||||
|
h('input', {
|
||||||
|
type: 'checkbox',
|
||||||
|
name: 'pocket-checkbox',
|
||||||
|
checked: this.state.dProvider,
|
||||||
|
onChange: (event) => {
|
||||||
|
event.preventDefault()
|
||||||
|
this.toggleProvider()
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
|
||||||
h('p.config-title', `Provider`),
|
h('p.config-title', `Provider`),
|
||||||
|
|
||||||
|
@ -233,23 +258,23 @@ class ConfigScreen extends Component {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleProvider(){
|
toggleProvider () {
|
||||||
const isPocket = POCKET_PROVIDER_TYPES.includes(this.props.metamask.provider.type)
|
const isPocket = POCKET_PROVIDER_TYPES.includes(this.props.metamask.provider.type)
|
||||||
if (isPocket){
|
if (isPocket) {
|
||||||
if (!this.state.dProvider){
|
if (!this.state.dProvider) {
|
||||||
this.props.dispatch(actions.setDProvider(true))
|
this.props.dispatch(actions.setDProvider(true))
|
||||||
this.setState({
|
this.setState({
|
||||||
dProvider: true
|
dProvider: true,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
this.props.dispatch(actions.setDProvider(false))
|
this.props.dispatch(actions.setDProvider(false))
|
||||||
this.setState({
|
this.setState({
|
||||||
dProvider: false
|
dProvider: false,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.props.dispatch(actions.setProviderType(this.props.metamask.provider.type))
|
this.props.dispatch(actions.setProviderType(this.props.metamask.provider.type))
|
||||||
} else {
|
} else {
|
||||||
alert("Pocket does not support this network, using centralized provider")
|
alert('Pocket does not support this network, using centralized provider')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,18 @@ const {
|
||||||
DAI_CODE,
|
DAI_CODE,
|
||||||
RSK_CODE,
|
RSK_CODE,
|
||||||
RSK_TESTNET_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')
|
} = require('../../app/scripts/controllers/network/enums')
|
||||||
|
|
||||||
var valueTable = {
|
var valueTable = {
|
||||||
|
@ -54,9 +66,12 @@ module.exports = {
|
||||||
ifHardwareAcc,
|
ifHardwareAcc,
|
||||||
getAllKeyRingsAccounts,
|
getAllKeyRingsAccounts,
|
||||||
ifRSK,
|
ifRSK,
|
||||||
|
ifRSKByProviderType,
|
||||||
ifPOA,
|
ifPOA,
|
||||||
toChecksumAddress,
|
toChecksumAddress,
|
||||||
isValidChecksumAddress,
|
isValidChecksumAddress,
|
||||||
|
isInfuraProvider,
|
||||||
|
isKnownProvider,
|
||||||
}
|
}
|
||||||
|
|
||||||
function valuesFor (obj) {
|
function valuesFor (obj) {
|
||||||
|
@ -391,6 +406,11 @@ function ifRSK (network) {
|
||||||
return numericNet === RSK_CODE || numericNet === RSK_TESTNET_CODE
|
return numericNet === RSK_CODE || numericNet === RSK_TESTNET_CODE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ifRSKByProviderType (type) {
|
||||||
|
if (!type) return false
|
||||||
|
return type === RSK || type === RSK_TESTNET
|
||||||
|
}
|
||||||
|
|
||||||
function ifPOA (network) {
|
function ifPOA (network) {
|
||||||
if (!network) return false
|
if (!network) return false
|
||||||
const numericNet = isNaN(network) ? network : parseInt(network)
|
const numericNet = isNaN(network) ? network : parseInt(network)
|
||||||
|
@ -424,3 +444,21 @@ function toChecksumAddress (network, address, chainId = null) {
|
||||||
function isValidChecksumAddress (network, address) {
|
function isValidChecksumAddress (network, address) {
|
||||||
return isValidAddress(address, network) && toChecksumAddress(network, address) === 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
|
||||||
|
}
|
||||||
|
|
|
@ -2904,6 +2904,23 @@
|
||||||
"integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
|
"integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/glob": {
|
||||||
|
"version": "7.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
|
||||||
|
"integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/events": "*",
|
||||||
|
"@types/minimatch": "*",
|
||||||
|
"@types/node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@types/minimatch": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
|
||||||
|
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "10.14.9",
|
"version": "10.14.9",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.9.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.9.tgz",
|
||||||
|
@ -6820,16 +6837,69 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"chromedriver": {
|
"chromedriver": {
|
||||||
"version": "74.0.0",
|
"version": "76.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-74.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-76.0.0.tgz",
|
||||||
"integrity": "sha512-xXgsq0l4gVTY9X5vuccOSVj/iEBm3Bf5MIwzSAASIRJagt4BlWw77SxQq1f4JAJ35/9Ys4NLMA/kWFbd7A/gfQ==",
|
"integrity": "sha512-jGyqs0N+lMo9iaNQxGKNPiLJWb2L9s2rwbRr1jJeQ37n6JQ1+5YMGviv/Fx5Z08vBWYbAvrKEzFsuYf8ppl+lw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"del": "^3.0.0",
|
"del": "^4.1.1",
|
||||||
"extract-zip": "^1.6.7",
|
"extract-zip": "^1.6.7",
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"request": "^2.88.0",
|
"request": "^2.88.0",
|
||||||
"tcp-port-used": "^1.0.1"
|
"tcp-port-used": "^1.0.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"del": {
|
||||||
|
"version": "4.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
|
||||||
|
"integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/glob": "^7.1.1",
|
||||||
|
"globby": "^6.1.0",
|
||||||
|
"is-path-cwd": "^2.0.0",
|
||||||
|
"is-path-in-cwd": "^2.0.0",
|
||||||
|
"p-map": "^2.0.0",
|
||||||
|
"pify": "^4.0.1",
|
||||||
|
"rimraf": "^2.6.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"is-path-cwd": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
|
||||||
|
"integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"is-path-in-cwd": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"is-path-inside": "^2.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"is-path-inside": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"path-is-inside": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"p-map": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"pify": {
|
||||||
|
"version": "4.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
|
||||||
|
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ci-info": {
|
"ci-info": {
|
||||||
|
@ -38381,9 +38451,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"selenium-webdriver": {
|
"selenium-webdriver": {
|
||||||
"version": "4.0.0-alpha.3",
|
"version": "4.0.0-alpha.4",
|
||||||
"resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.3.tgz",
|
"resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.4.tgz",
|
||||||
"integrity": "sha512-78a8bbvVtl3asv5JAiBXvK4KQ+GmXBCMO0DU1ZMbdO9EAb+ydPA53CI4ZA+I8muSLSVgNhRAnsndNWZLIQN2LA==",
|
"integrity": "sha512-etJt20d8qInkxMAHIm5SEpPBSS+CdxVcybnxzSIB/GlWErb8pIWrArz/VA6VfUW0/6tIcokepXQ5ufvdzqqk1A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"jszip": "^3.1.5",
|
"jszip": "^3.1.5",
|
||||||
|
|
|
@ -233,7 +233,7 @@
|
||||||
"brfs": "^1.6.1",
|
"brfs": "^1.6.1",
|
||||||
"browserify": "^16.2.3",
|
"browserify": "^16.2.3",
|
||||||
"chai": "^4.1.0",
|
"chai": "^4.1.0",
|
||||||
"chromedriver": "^74.0.0",
|
"chromedriver": "^76.0.0",
|
||||||
"clipboardy": "^1.2.3",
|
"clipboardy": "^1.2.3",
|
||||||
"compression": "^1.7.1",
|
"compression": "^1.7.1",
|
||||||
"coveralls": "^3.0.0",
|
"coveralls": "^3.0.0",
|
||||||
|
@ -308,7 +308,7 @@
|
||||||
"resolve-url-loader": "^2.3.0",
|
"resolve-url-loader": "^2.3.0",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
"sass-loader": "^7.0.1",
|
"sass-loader": "^7.0.1",
|
||||||
"selenium-webdriver": "^4.0.0-alpha.1",
|
"selenium-webdriver": "^4.0.0-alpha.4",
|
||||||
"shell-parallel": "^1.0.3",
|
"shell-parallel": "^1.0.3",
|
||||||
"sinon": "^5.0.0",
|
"sinon": "^5.0.0",
|
||||||
"source-map": "^0.7.2",
|
"source-map": "^0.7.2",
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const Func = require('./func').Functions
|
const Func = require('./func').Functions
|
||||||
const account1 = '0x2E428ABd9313D256d64D1f69fe3929C3BE18fD1f'
|
const account1 = '0x2E428ABd9313D256d64D1f69fe3929C3BE18fD1f'
|
||||||
|
const account1RSK = '0x2E428aBd9313D256d64D1f69fe3929c3Be18Fd1F'
|
||||||
const account2 = '0xd7b7AFeCa35e32594e29504771aC847E2a803742'
|
const account2 = '0xd7b7AFeCa35e32594e29504771aC847E2a803742'
|
||||||
const testsFolder = './test-cases'
|
const testsFolder = './test-cases'
|
||||||
const setup = require(`${testsFolder}/setup.spec`)
|
const setup = require(`${testsFolder}/setup.spec`)
|
||||||
|
@ -117,7 +118,7 @@ describe('Metamask popup page', async function () {
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('RSK network tests', async () => {
|
describe('RSK network tests', async () => {
|
||||||
await RSKNetworkTests(f, account1)
|
await RSKNetworkTests(f, account1RSK)
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('Check the filter of emitted events', async () => {
|
describe('Check the filter of emitted events', async () => {
|
||||||
|
@ -137,7 +138,7 @@ describe('Metamask popup page', async function () {
|
||||||
await addTokeFromSearch(f)
|
await addTokeFromSearch(f)
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('Custom Rpc', async () => {
|
describe('Custom RPC', async () => {
|
||||||
await customRPC(f)
|
await customRPC(f)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,90 +1,90 @@
|
||||||
// const assert = require('assert')
|
const assert = require('assert')
|
||||||
// const { screens, elements, NETWORKS } = require('../elements')
|
const { screens, elements, NETWORKS } = require('../elements')
|
||||||
|
|
||||||
const RSKNetworkTests = async (f, account1) => {
|
const RSKNetworkTests = async (f, account1) => {
|
||||||
// it('connects to RSK mainnet', async function () {
|
it('connects to RSK mainnet', async function () {
|
||||||
// await f.setProvider(NETWORKS.RSK)
|
await f.setProvider(NETWORKS.RSK)
|
||||||
// await f.delay(2000)
|
await f.delay(2000)
|
||||||
// })
|
})
|
||||||
|
|
||||||
// it('connects to RSK testnet', async function () {
|
it('connects to RSK testnet', async function () {
|
||||||
// await f.setProvider(NETWORKS.RSK_TESTNET)
|
await f.setProvider(NETWORKS.RSK_TESTNET)
|
||||||
// await f.delay(2000)
|
await f.delay(2000)
|
||||||
// })
|
})
|
||||||
|
|
||||||
// it('checks zero exchange rate for RSK testnet', async function () {
|
it('checks zero exchange rate for RSK testnet', async function () {
|
||||||
// const balanceField = await f.waitUntilShowUp(screens.main.balance)
|
const balanceField = await f.waitUntilShowUp(screens.main.balance)
|
||||||
// const balanceUSDField = await f.waitUntilShowUp(screens.main.balanceUSD)
|
const balanceUSDField = await f.waitUntilShowUp(screens.main.balanceUSD)
|
||||||
// await f.delay(2000)
|
await f.delay(2000)
|
||||||
// const balance = await balanceField.getText()
|
const balance = await balanceField.getText()
|
||||||
// const balanceUSD = await balanceUSDField.getText()
|
const balanceUSD = await balanceUSDField.getText()
|
||||||
// console.log('Balance = ' + parseFloat(balance))
|
console.log('Balance = ' + parseFloat(balance))
|
||||||
// console.log('balanceUSD = ' + parseFloat(balanceUSD))
|
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(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')
|
assert.equal(parseFloat(balanceUSD), 0, 'USD balance of account is not zero')
|
||||||
// })
|
})
|
||||||
|
|
||||||
// it('opens RSK faucet', async function () {
|
it('opens RSK faucet', async function () {
|
||||||
// await f.waitUntilShowUp(screens.main.buttons.buyRSK)
|
await f.waitUntilShowUp(screens.main.buttons.buyRSK)
|
||||||
// const buttons = await f.driver.findElements(screens.main.buttons.buyRSK)
|
const buttons = await f.driver.findElements(screens.main.buttons.buyRSK)
|
||||||
// assert.equal(buttons.length, 1, 'main screen isn\'t displayed')
|
assert.equal(buttons.length, 1, 'main screen isn\'t displayed')
|
||||||
// const buyButton = buttons[0]
|
const buyButton = buttons[0]
|
||||||
// const buyButtonText = await buyButton.getText()
|
const buyButtonText = await buyButton.getText()
|
||||||
// assert.equal(buyButtonText, 'Buy', 'button has incorrect name')
|
assert.equal(buyButtonText, 'Buy', 'button has incorrect name')
|
||||||
// await buyButton.click()
|
await buyButton.click()
|
||||||
// await f.delay(2000)
|
await f.delay(2000)
|
||||||
// const title = await f.waitUntilShowUp(screens.buyEther.title)
|
const title = await f.waitUntilShowUp(screens.buyEther.title)
|
||||||
// assert.equal(await title.getText(), 'Buy RBTC', "screen 'Buy RBTC' has incorrect title text")
|
assert.equal(await title.getText(), 'Buy RBTC', "screen 'Buy RBTC' has incorrect title text")
|
||||||
// await f.waitUntilShowUp(screens.buyEther.faucetLinkRSK)
|
await f.waitUntilShowUp(screens.buyEther.faucetLinkRSK)
|
||||||
// const faucetButtons = await f.driver.findElements(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')
|
assert.equal(faucetButtons.length, 1, 'there is no faucet button on the screen')
|
||||||
// const faucetLinkButton = faucetButtons[0]
|
const faucetLinkButton = faucetButtons[0]
|
||||||
// assert.equal(await faucetLinkButton.getText(), 'RSK Testnet Test Faucet', "screen 'Buy RSK' has incorrect name for faucet link")
|
assert.equal(await faucetLinkButton.getText(), 'RSK Testnet Test Faucet', "screen 'Buy RSK' has incorrect name for faucet link")
|
||||||
// await faucetLinkButton.click()
|
await faucetLinkButton.click()
|
||||||
// await f.delay(3000)
|
await f.delay(3000)
|
||||||
// const [tab0, tab1] = await f.driver.getAllWindowHandles()
|
const [tab0, tab1] = await f.driver.getAllWindowHandles()
|
||||||
// await f.driver.switchTo().window(tab1)
|
await f.driver.switchTo().window(tab1)
|
||||||
// const faucetLink = await f.driver.getCurrentUrl()
|
const faucetLink = await f.driver.getCurrentUrl()
|
||||||
// assert.equal(faucetLink, 'https://faucet.testnet.rsk.co/', 'Incorrect faucet link for RSK network')
|
assert.equal(faucetLink, 'https://faucet.testnet.rsk.co/', 'Incorrect faucet link for RSK network')
|
||||||
// await f.driver.close()
|
await f.driver.close()
|
||||||
// await f.driver.switchTo().window(tab0)
|
await f.driver.switchTo().window(tab0)
|
||||||
// const arrow = await f.waitUntilShowUp(elements.buttonArrow)
|
const arrow = await f.waitUntilShowUp(elements.buttonArrow)
|
||||||
// await arrow.click()
|
await arrow.click()
|
||||||
// await f.delay(2000)
|
await f.delay(2000)
|
||||||
// })
|
})
|
||||||
|
|
||||||
// it('opens send transaction screen', async function () {
|
it('opens send transaction screen', async function () {
|
||||||
// const sendButton = await f.waitUntilShowUp(screens.main.buttons.sendRSK)
|
const sendButton = await f.waitUntilShowUp(screens.main.buttons.sendRSK)
|
||||||
// assert.equal(await sendButton.getText(), screens.main.buttons.sendText)
|
assert.equal(await sendButton.getText(), screens.main.buttons.sendText)
|
||||||
// await f.click(sendButton)
|
await f.click(sendButton)
|
||||||
// })
|
})
|
||||||
|
|
||||||
// it('adds recipient address and amount', async function () {
|
it('adds recipient address and amount', async function () {
|
||||||
// const sendTranscationScreen = await f.waitUntilShowUp(screens.sendTransaction.title)
|
const sendTranscationScreen = await f.waitUntilShowUp(screens.sendTransaction.title)
|
||||||
// assert.equal(await sendTranscationScreen.getText(), screens.sendTransaction.titleText, 'Transaction screen has incorrect titlr')
|
assert.equal(await sendTranscationScreen.getText(), screens.sendTransaction.titleText, 'Transaction screen has incorrect titlr')
|
||||||
// const inputAddress = await f.waitUntilShowUp(screens.sendTransaction.field.address)
|
const inputAddress = await f.waitUntilShowUp(screens.sendTransaction.field.address)
|
||||||
// const inputAmmount = await f.waitUntilShowUp(screens.sendTransaction.field.amount)
|
const inputAmmount = await f.waitUntilShowUp(screens.sendTransaction.field.amount)
|
||||||
// await inputAddress.sendKeys(account1)
|
await inputAddress.sendKeys(account1)
|
||||||
// await f.clearField(inputAmmount)
|
await f.clearField(inputAmmount)
|
||||||
// await inputAmmount.sendKeys('0.000001')
|
await inputAmmount.sendKeys('0.000001')
|
||||||
// const button = await f.waitUntilShowUp(screens.sendTransaction.buttonNext)
|
const button = await f.waitUntilShowUp(screens.sendTransaction.buttonNext)
|
||||||
// assert.equal(await button.getText(), 'Next', 'button has incorrect name')
|
assert.equal(await button.getText(), 'Next', 'button has incorrect name')
|
||||||
// await f.click(button)
|
await f.click(button)
|
||||||
// })
|
})
|
||||||
|
|
||||||
// it('confirms transaction', async function () {
|
it('confirms transaction', async function () {
|
||||||
// const inputGasLimit = await f.waitUntilShowUp(screens.confirmTransaction.fields.gasLimit)
|
const inputGasLimit = await f.waitUntilShowUp(screens.confirmTransaction.fields.gasLimit)
|
||||||
// await f.clearField(inputGasLimit)
|
await f.clearField(inputGasLimit)
|
||||||
// await inputGasLimit.sendKeys('21000')
|
await inputGasLimit.sendKeys('21000')
|
||||||
// const button = await f.waitUntilShowUp(screens.confirmTransaction.button.submit)
|
const button = await f.waitUntilShowUp(screens.confirmTransaction.button.submit)
|
||||||
// assert.equal(await button.getAttribute('value'), 'Submit', 'button has incorrect name')
|
assert.equal(await button.getAttribute('value'), 'Submit', 'button has incorrect name')
|
||||||
// await f.click(button)
|
await f.click(button)
|
||||||
// })
|
})
|
||||||
|
|
||||||
// it('finds the transaction in the transactions list', async function () {
|
it('finds the transaction in the transactions list', async function () {
|
||||||
// const transactionAmount = await f.waitUntilShowUp(screens.main.transactionList)
|
const transactionAmount = await f.waitUntilShowUp(screens.main.transactionList)
|
||||||
// assert.equal(await transactionAmount.getText(), '<0.001')
|
assert.equal(await transactionAmount.getText(), '<0.001')
|
||||||
// })
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = RSKNetworkTests
|
module.exports = RSKNetworkTests
|
||||||
|
|
|
@ -47,7 +47,7 @@ describe('# Network Controller', function () {
|
||||||
|
|
||||||
describe('#setNetworkState', function () {
|
describe('#setNetworkState', function () {
|
||||||
it('should update the network', function () {
|
it('should update the network', function () {
|
||||||
networkController.setNetworkState(1)
|
networkController.setNetworkState(1, 'mainnet')
|
||||||
const networkState = networkController.getNetworkState()
|
const networkState = networkController.getNetworkState()
|
||||||
assert.equal(networkState, 1, 'network is 1')
|
assert.equal(networkState, 1, 'network is 1')
|
||||||
})
|
})
|
||||||
|
|
|
@ -14,9 +14,12 @@ const {
|
||||||
normalizeNumberToWei,
|
normalizeNumberToWei,
|
||||||
isHex,
|
isHex,
|
||||||
ifRSK,
|
ifRSK,
|
||||||
|
ifRSKByProviderType,
|
||||||
ifPOA,
|
ifPOA,
|
||||||
toChecksumAddress,
|
toChecksumAddress,
|
||||||
isValidChecksumAddress,
|
isValidChecksumAddress,
|
||||||
|
isInfuraProvider,
|
||||||
|
isKnownProvider,
|
||||||
} = require('../../../../old-ui/app/util')
|
} = require('../../../../old-ui/app/util')
|
||||||
const ethUtil = require('ethereumjs-util')
|
const ethUtil = require('ethereumjs-util')
|
||||||
let ethInWei = '1'
|
let ethInWei = '1'
|
||||||
|
@ -336,30 +339,29 @@ describe('normalizing values', function () {
|
||||||
|
|
||||||
describe('#ifRSK', function () {
|
describe('#ifRSK', function () {
|
||||||
it('checks if this is RSK chain', function () {
|
it('checks if this is RSK chain', function () {
|
||||||
var result1 = ifRSK(30)
|
assert(ifRSK(30))
|
||||||
assert(result1)
|
assert(ifRSK(31))
|
||||||
var result2 = ifRSK(31)
|
assert(!ifRSK(1))
|
||||||
assert(result2)
|
assert(!ifRSK())
|
||||||
var result3 = ifRSK(1)
|
|
||||||
assert(!result3)
|
|
||||||
var result4 = ifRSK()
|
|
||||||
assert(!result4)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
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 () {
|
describe('#ifPOA', function () {
|
||||||
it('checks if this is POA chain', function () {
|
it('checks if this is POA chain', function () {
|
||||||
var resultSokol = ifPOA(77)
|
assert(ifPOA(77))
|
||||||
assert(resultSokol)
|
assert(ifPOA(99))
|
||||||
var resultCore = ifPOA(99)
|
assert(ifPOA(100))
|
||||||
assert(resultCore)
|
assert(!ifPOA(1))
|
||||||
var resultXDai = ifPOA(100)
|
assert(!ifPOA())
|
||||||
assert(resultXDai)
|
|
||||||
var resultMainnet = ifPOA(1)
|
|
||||||
assert(!resultMainnet)
|
|
||||||
var result4 = ifPOA()
|
|
||||||
assert(!result4)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -380,12 +382,36 @@ describe('normalizing values', function () {
|
||||||
|
|
||||||
describe('#isValidChecksumAddress', function () {
|
describe('#isValidChecksumAddress', function () {
|
||||||
it('checks if is valid checksum address', function () {
|
it('checks if is valid checksum address', function () {
|
||||||
var resultMainnet = isValidChecksumAddress('30', addrRSKMainnet)
|
assert(isValidChecksumAddress('30', addrRSKMainnet))
|
||||||
assert(resultMainnet)
|
assert(isValidChecksumAddress('31', addrRSKTestnet))
|
||||||
var resultTestnet = isValidChecksumAddress('31', addrRSKTestnet)
|
assert(isValidChecksumAddress('1', addrETHMainnet))
|
||||||
assert(resultTestnet)
|
})
|
||||||
var resultNotRSK = isValidChecksumAddress('1', addrETHMainnet)
|
})
|
||||||
assert(resultNotRSK)
|
|
||||||
|
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'))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -355,7 +355,7 @@ function reduceMetamask (state, action) {
|
||||||
case actions.SET_DPROVIDER:
|
case actions.SET_DPROVIDER:
|
||||||
return extend(metamaskState, {
|
return extend(metamaskState, {
|
||||||
dProviderStore: {
|
dProviderStore: {
|
||||||
dProvider : action.value,
|
dProvider: action.value,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue