From 47a786650911918f452342141280b4e1a7e77e45 Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Thu, 10 Jan 2019 19:59:43 +0300 Subject: [PATCH 1/8] Add RSK testnet/mainnet to the list of networks --- app/scripts/controllers/network/enums.js | 84 ++++++---- app/scripts/controllers/network/network.js | 30 +++- app/scripts/controllers/network/util.js | 142 +++++++++++++--- app/scripts/lib/buy-eth-url.js | 30 +++- app/scripts/metamask-controller.js | 6 +- app/scripts/platforms/extension.js | 8 +- old-ui/app/accounts/import/contract.js | 22 ++- .../add-token/add-token.component.js | 7 +- old-ui/app/components/app-bar.js | 157 ++++-------------- old-ui/app/components/buy-button-subview.js | 5 +- old-ui/app/components/fiat-value.js | 5 +- old-ui/app/components/network.js | 38 +---- old-ui/app/components/send/send-contract.js | 1 - old-ui/app/components/token-cell.js | 3 +- .../app/components/transaction-list-item.js | 22 ++- old-ui/app/components/transaction-list.js | 3 +- old-ui/app/conf-tx.js | 5 +- old-ui/app/config.js | 47 +----- package-lock.json | 62 ++++--- package.json | 2 +- test/e2e/elements.js | 2 + test/e2e/func.js | 12 +- test/e2e/metamask.spec.js | 2 +- 23 files changed, 381 insertions(+), 314 deletions(-) diff --git a/app/scripts/controllers/network/enums.js b/app/scripts/controllers/network/enums.js index 1a9890e8b..e9a58ec68 100644 --- a/app/scripts/controllers/network/enums.js +++ b/app/scripts/controllers/network/enums.js @@ -1,64 +1,80 @@ +const POA = 'poa' +const DAI = 'dai' +const POA_SOKOL = 'sokol' +const MAINNET = 'mainnet' const ROPSTEN = 'ropsten' const RINKEBY = 'rinkeby' const KOVAN = 'kovan' -const MAINNET = 'mainnet' -const POA_SOKOL = 'sokol' -const POA = 'poa' -const DAI = 'dai' +const RSK = 'rsk' +const RSK_TESTNET = 'rsk_testnet' const LOCALHOST = 'localhost' -const MAINNET_CODE = 1 -const ROPSTEN_CODE = 3 -const RINKEYBY_CODE = 4 -const KOVAN_CODE = 42 -const POA_SOKOL_CODE = 77 const POA_CODE = 99 const DAI_CODE = 100 +const POA_SOKOL_CODE = 77 +const MAINNET_CODE = 1 +const ROPSTEN_CODE = 3 +const RINKEBY_CODE = 4 +const KOVAN_CODE = 42 +const RSK_CODE = 30 +const RSK_TESTNET_CODE = 31 +const POA_DISPLAY_NAME = 'POA Network' +const DAI_DISPLAY_NAME = 'xDai Chain' +const POA_SOKOL_DISPLAY_NAME = 'Sokol' +const MAINNET_DISPLAY_NAME = 'Main Ethereum Network' const ROPSTEN_DISPLAY_NAME = 'Ropsten' const RINKEBY_DISPLAY_NAME = 'Rinkeby' const KOVAN_DISPLAY_NAME = 'Kovan' -const POA_SOKOL_DISPLAY_NAME = 'Sokol' -const POA_DISPLAY_NAME = 'POA Network' -const DAI_DISPLAY_NAME = 'xDai Chain' -const MAINNET_DISPLAY_NAME = 'Main Ethereum Network' +const RSK_DISPLAY_NAME = 'RSK Mainnet' +const RSK_TESTNET_DISPLAY_NAME = 'RSK Testnet' +const DROPDOWN_POA_DISPLAY_NAME = POA_DISPLAY_NAME +const DROPDOWN_DAI_DISPLAY_NAME = DAI_DISPLAY_NAME +const DROPDOWN_POA_SOKOL_DISPLAY_NAME = 'Sokol Network' +const DROPDOWN_MAINNET_DISPLAY_NAME = 'Main Network' const DROPDOWN_ROPSTEN_DISPLAY_NAME = 'Ropsten Test Net' const DROPDOWN_RINKEBY_DISPLAY_NAME = 'Rinkeby Test Net' const DROPDOWN_KOVAN_DISPLAY_NAME = 'Kovan Test Net' -const DROPDOWN_POA_SOKOL_DISPLAY_NAME = 'Sokol Network' -const DROPDOWN_POA_DISPLAY_NAME = POA_DISPLAY_NAME -const DROPDOWN_DAI_DISPLAY_NAME = DAI_DISPLAY_NAME -const DROPDOWN_MAINNET_DISPLAY_NAME = 'Main Network' +const DROPDOWN_RSK_DISPLAY_NAME = 'RSK Main Net' +const DROPDOWN_RSK_TESTNET_DISPLAY_NAME = 'RSK Test Net' module.exports = { + POA, + DAI, + POA_SOKOL, + MAINNET, ROPSTEN, RINKEBY, KOVAN, - MAINNET, - POA_SOKOL, - POA, - DAI, + RSK, + RSK_TESTNET, LOCALHOST, - MAINNET_CODE, - ROPSTEN_CODE, - RINKEYBY_CODE, - KOVAN_CODE, - POA_SOKOL_CODE, POA_CODE, DAI_CODE, + POA_SOKOL_CODE, + MAINNET_CODE, + ROPSTEN_CODE, + RINKEBY_CODE, + KOVAN_CODE, + RSK_CODE, + RSK_TESTNET_CODE, + POA_DISPLAY_NAME, + DAI_DISPLAY_NAME, + POA_SOKOL_DISPLAY_NAME, + MAINNET_DISPLAY_NAME, ROPSTEN_DISPLAY_NAME, RINKEBY_DISPLAY_NAME, KOVAN_DISPLAY_NAME, - MAINNET_DISPLAY_NAME, - POA_SOKOL_DISPLAY_NAME, - POA_DISPLAY_NAME, - DAI_DISPLAY_NAME, + RSK_DISPLAY_NAME, + RSK_TESTNET_DISPLAY_NAME, + DROPDOWN_POA_DISPLAY_NAME, + DROPDOWN_DAI_DISPLAY_NAME, + DROPDOWN_POA_SOKOL_DISPLAY_NAME, + DROPDOWN_MAINNET_DISPLAY_NAME, DROPDOWN_ROPSTEN_DISPLAY_NAME, DROPDOWN_RINKEBY_DISPLAY_NAME, DROPDOWN_KOVAN_DISPLAY_NAME, - DROPDOWN_POA_SOKOL_DISPLAY_NAME, - DROPDOWN_POA_DISPLAY_NAME, - DROPDOWN_DAI_DISPLAY_NAME, - DROPDOWN_MAINNET_DISPLAY_NAME, + DROPDOWN_RSK_DISPLAY_NAME, + DROPDOWN_RSK_TESTNET_DISPLAY_NAME, } diff --git a/app/scripts/controllers/network/network.js b/app/scripts/controllers/network/network.js index 97eea4cbc..3a1a0bd44 100644 --- a/app/scripts/controllers/network/network.js +++ b/app/scripts/controllers/network/network.js @@ -11,6 +11,7 @@ const createInfuraClient = require('./createInfuraClient') const createJsonRpcClient = require('./createJsonRpcClient') const createLocalhostClient = require('./createLocalhostClient') const { createSwappableProxy, createEventEmitterProxy } = require('swappable-obj-proxy') +const ethNetProps = require('eth-net-props') const { ROPSTEN, @@ -21,10 +22,14 @@ const { POA_SOKOL, POA, DAI, + RSK, + RSK_TESTNET, + POA_CODE, + DAI_CODE, + POA_SOKOL_CODE, + RSK_CODE, + RSK_TESTNET_CODE, } = require('./enums') -const POA_RPC_URL = 'https://core.poa.network' -const DAI_RPC_URL = 'https://dai.poa.network' -const SOKOL_RPC_URL = 'https://sokol.poa.network' const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET] const env = process.env.METAMASK_ENV @@ -109,7 +114,14 @@ module.exports = class NetworkController extends EventEmitter { async setProviderType (type) { 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, `NetworkController - Unknown rpc type "${type}"`) + assert(INFURA_PROVIDER_TYPES.includes(type) || + type === LOCALHOST || + type === POA_SOKOL || + type === POA || + type === DAI || + type === RSK || + type === RSK_TESTNET + , `NetworkController - Unknown rpc type "${type}"`) const providerConfig = { type } this.providerConfig = providerConfig } @@ -145,11 +157,15 @@ module.exports = class NetworkController extends EventEmitter { this._configureInfuraProvider(opts) // other type-based rpc endpoints } else if (type === POA) { - this._configureStandardProvider({ rpcUrl: POA_RPC_URL }) + this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_CODE)[0] }) } else if (type === DAI) { - this._configureStandardProvider({ rpcUrl: DAI_RPC_URL }) + this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(DAI_CODE)[0] }) } else if (type === POA_SOKOL) { - this._configureStandardProvider({ rpcUrl: SOKOL_RPC_URL }) + this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_SOKOL_CODE)[0] }) + } else if (type === RSK) { + this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(RSK_CODE)[0] }) + } else if (type === RSK_TESTNET) { + this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(RSK_TESTNET_CODE)[0] }) } else if (type === LOCALHOST) { this._configureLocalhostProvider() // url-based rpc endpoints diff --git a/app/scripts/controllers/network/util.js b/app/scripts/controllers/network/util.js index 414e1feb8..1a0059a17 100644 --- a/app/scripts/controllers/network/util.js +++ b/app/scripts/controllers/network/util.js @@ -1,39 +1,137 @@ const { - POA_SOKOL, POA, + DAI, + POA_SOKOL, + MAINNET, ROPSTEN, RINKEBY, KOVAN, - MAINNET, - POA_SOKOL_CODE, - ROPSTEN_CODE, - RINKEYBY_CODE, - KOVAN_CODE, + RSK, + RSK_TESTNET, POA_CODE, + DAI_CODE, + POA_SOKOL_CODE, + MAINNET_CODE, + ROPSTEN_CODE, + RINKEBY_CODE, + KOVAN_CODE, + RSK_CODE, + RSK_TESTNET_CODE, + POA_DISPLAY_NAME, + DAI_DISPLAY_NAME, POA_SOKOL_DISPLAY_NAME, + MAINNET_DISPLAY_NAME, ROPSTEN_DISPLAY_NAME, RINKEBY_DISPLAY_NAME, KOVAN_DISPLAY_NAME, - MAINNET_DISPLAY_NAME, - POA_DISPLAY_NAME, + RSK_DISPLAY_NAME, + RSK_TESTNET_DISPLAY_NAME, + DROPDOWN_POA_DISPLAY_NAME, + DROPDOWN_DAI_DISPLAY_NAME, + DROPDOWN_POA_SOKOL_DISPLAY_NAME, + DROPDOWN_MAINNET_DISPLAY_NAME, + DROPDOWN_ROPSTEN_DISPLAY_NAME, + DROPDOWN_RINKEBY_DISPLAY_NAME, + DROPDOWN_KOVAN_DISPLAY_NAME, + DROPDOWN_RSK_DISPLAY_NAME, + DROPDOWN_RSK_TESTNET_DISPLAY_NAME, } = require('./enums') -const networkToNameMap = { - [POA_SOKOL]: POA_SOKOL_DISPLAY_NAME, - [POA]: POA_SOKOL_DISPLAY_NAME, - [ROPSTEN]: ROPSTEN_DISPLAY_NAME, - [RINKEBY]: RINKEBY_DISPLAY_NAME, - [KOVAN]: KOVAN_DISPLAY_NAME, - [MAINNET]: MAINNET_DISPLAY_NAME, - [POA_SOKOL_CODE]: POA_SOKOL_DISPLAY_NAME, - [ROPSTEN_CODE]: ROPSTEN_DISPLAY_NAME, - [RINKEYBY_CODE]: RINKEBY_DISPLAY_NAME, - [KOVAN_CODE]: KOVAN_DISPLAY_NAME, - [POA_CODE]: POA_DISPLAY_NAME, -} +const networks = {} -const getNetworkDisplayName = key => networkToNameMap[key] +const POA_OBJ = { + order: 1, + providerName: POA, + networkID: POA_CODE, + displayName: POA_DISPLAY_NAME, + displayNameDropdown: DROPDOWN_POA_DISPLAY_NAME, +} +networks[POA_CODE] = POA_OBJ +networks[POA] = POA_OBJ + +const DAI_OBJ = { + order: 2, + providerName: DAI, + networkID: DAI_CODE, + displayName: DAI_DISPLAY_NAME, + displayNameDropdown: DROPDOWN_DAI_DISPLAY_NAME, +} +networks[DAI_CODE] = DAI_OBJ +networks[DAI] = DAI_OBJ + +const POA_SOKOL_OBJ = { + order: 3, + providerName: POA_SOKOL, + networkID: POA_SOKOL_CODE, + displayName: POA_SOKOL_DISPLAY_NAME, + displayNameDropdown: DROPDOWN_POA_SOKOL_DISPLAY_NAME, +} +networks[POA_SOKOL_CODE] = POA_SOKOL_OBJ +networks[POA_SOKOL] = POA_SOKOL_OBJ + +const MAINNET_OBJ = { + order: 4, + providerName: MAINNET, + networkID: MAINNET_CODE, + displayName: MAINNET_DISPLAY_NAME, + displayNameDropdown: DROPDOWN_MAINNET_DISPLAY_NAME, +} +networks[MAINNET_CODE] = MAINNET_OBJ +networks[MAINNET] = MAINNET_OBJ + +const ROPSTEN_OBJ = { + order: 5, + providerName: ROPSTEN, + networkID: ROPSTEN_CODE, + displayName: ROPSTEN_DISPLAY_NAME, + displayNameDropdown: DROPDOWN_ROPSTEN_DISPLAY_NAME, +} +networks[ROPSTEN_CODE] = ROPSTEN_OBJ +networks[ROPSTEN] = ROPSTEN_OBJ + +const KOVAN_OBJ = { + order: 6, + providerName: KOVAN, + networkID: KOVAN_CODE, + displayName: KOVAN_DISPLAY_NAME, + displayNameDropdown: DROPDOWN_KOVAN_DISPLAY_NAME, +} +networks[KOVAN_CODE] = KOVAN_OBJ +networks[KOVAN] = KOVAN_OBJ + +const RINKEBY_OBJ = { + order: 7, + providerName: RINKEBY, + networkID: RINKEBY_CODE, + displayName: RINKEBY_DISPLAY_NAME, + displayNameDropdown: DROPDOWN_RINKEBY_DISPLAY_NAME, +} +networks[RINKEBY_CODE] = RINKEBY_OBJ +networks[RINKEBY] = RINKEBY_OBJ + +const RSK_OBJ = { + order: 8, + providerName: RSK, + networkID: RSK_CODE, + displayName: RSK_DISPLAY_NAME, + displayNameDropdown: DROPDOWN_RSK_DISPLAY_NAME, +} +networks[RSK_CODE] = RSK_OBJ +networks[RSK] = RSK_OBJ + +const RSK_TESTNET_OBJ = { + order: 9, + providerName: RSK_TESTNET, + networkID: RSK_TESTNET_CODE, + displayName: RSK_TESTNET_DISPLAY_NAME, + displayNameDropdown: DROPDOWN_RSK_TESTNET_DISPLAY_NAME, +} +networks[RSK_TESTNET_CODE] = RSK_TESTNET_OBJ +networks[RSK_TESTNET] = RSK_TESTNET_OBJ + +const getNetworkDisplayName = key => networks[key].displayName module.exports = { + networks, getNetworkDisplayName, } diff --git a/app/scripts/lib/buy-eth-url.js b/app/scripts/lib/buy-eth-url.js index db2fafd82..9bb09885b 100644 --- a/app/scripts/lib/buy-eth-url.js +++ b/app/scripts/lib/buy-eth-url.js @@ -5,6 +5,16 @@ module.exports = { } const ethNetProps = require('eth-net-props') +const { POA_CODE, + DAI_CODE, + POA_SOKOL_CODE, + MAINNET_CODE, + ROPSTEN_CODE, + RINKEBY_CODE, + KOVAN_CODE, + RSK_CODE, + RSK_TESTNET_CODE } = require('../controllers/network/enums') + /** * Gives the caller a url at which the user can acquire coin, depending on the network they are in * @@ -19,16 +29,18 @@ const ethNetProps = require('eth-net-props') */ function getBuyEthUrl ({ network, amount, address, ind }) { let url - switch (network) { - case '1': - case '99': - case '100': + switch (Number(network)) { + case MAINNET_CODE: + case POA_CODE: + case DAI_CODE: + case RSK_CODE: url = getExchanges({network, amount, address})[ind].link break - case '3': - case '4': - case '42': - case '77': + case ROPSTEN_CODE: + case RINKEBY_CODE: + case KOVAN_CODE: + case POA_SOKOL_CODE: + case RSK_TESTNET_CODE: url = getFaucets(network)[ind] break } @@ -85,5 +97,7 @@ function getExchanges ({network, amount, address}) { link: 'https://dai-bridge.poa.network/', }, ] + default: + return [] } } diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index cc13c9ad7..9e0fc30d1 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -52,6 +52,10 @@ const EthQuery = require('eth-query') const ethUtil = require('ethereumjs-util') const sigUtil = require('eth-sig-util') +const { POA_CODE, + DAI_CODE, + POA_SOKOL_CODE } = require('./controllers/network/enums') + module.exports = class MetamaskController extends EventEmitter { /** @@ -1390,7 +1394,7 @@ module.exports = class MetamaskController extends EventEmitter { const networkIdStr = networkController.store.getState().network const networkId = parseInt(networkIdStr) - const isPOA = networkId === 77 || networkId === 99 + const isPOA = networkId === POA_SOKOL_CODE || networkId === POA_CODE || networkId === DAI_CODE // Return 1 gwei if using a POA network of if there are no blocks have been observed: if (isPOA || recentBlocks.length === 0) { diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index 7d74bf41e..1952d6b99 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -1,6 +1,9 @@ const extension = require('extensionizer') const explorerLinks = require('eth-net-props').explorerLinks const { capitalizeFirstLetter } = require('../lib/util') +const { POA_CODE, + DAI_CODE, + POA_SOKOL_CODE } = require('../controllers/network/enums') class ExtensionPlatform { @@ -125,7 +128,10 @@ class ExtensionPlatform { _getExplorer (hash, networkId) { let explorerName - if (networkId === 99 || networkId === 100 || networkId === 77) { + if (networkId === POA_CODE || + networkId === DAI_CODE || + networkId === POA_SOKOL_CODE + ) { explorerName = 'BlockScout' } else { explorerName = 'Etherscan' diff --git a/old-ui/app/accounts/import/contract.js b/old-ui/app/accounts/import/contract.js index 6d855e0f8..c279e8227 100644 --- a/old-ui/app/accounts/import/contract.js +++ b/old-ui/app/accounts/import/contract.js @@ -6,6 +6,14 @@ import Web3 from 'web3' import log from 'loglevel' import copyToClipboard from 'copy-to-clipboard' +import { POA_CODE, + DAI_CODE, + POA_SOKOL_CODE, + MAINNET_CODE, + ROPSTEN_CODE, + RINKEBY_CODE, + KOVAN_CODE } from '../../../../app/scripts/controllers/network/enums' + class ContractImportView extends Component { constructor (props) { super(props) @@ -186,19 +194,19 @@ class ContractImportView extends Component { getBlockscoutApiNetworkSuffix () { const { network } = this.props switch (Number(network)) { - case 1: + case MAINNET_CODE: return 'mainnet' - case 99: + case POA_CODE: return 'core' - case 77: + case POA_SOKOL_CODE: return 'sokol' - case 100: + case DAI_CODE: return 'dai' - case 42: + case KOVAN_CODE: return 'kovan' - case 3: + case ROPSTEN_CODE: return 'ropsten' - case 4: + case RINKEBY_CODE: return 'rinkeby' default: return '' diff --git a/old-ui/app/components/add-token/add-token.component.js b/old-ui/app/components/add-token/add-token.component.js index 2bcfe4699..3bef803b6 100644 --- a/old-ui/app/components/add-token/add-token.component.js +++ b/old-ui/app/components/add-token/add-token.component.js @@ -18,6 +18,8 @@ const emptyAddr = '0x0000000000000000000000000000000000000000' const SEARCH_TAB = 'SEARCH' const CUSTOM_TOKEN_TAB = 'CUSTOM_TOKEN' +const { POA_CODE, MAINNET_CODE } = require('../../../../app/scripts/controllers/network/enums') + class AddTokenScreen extends Component { static contextTypes = { @@ -93,8 +95,9 @@ class AddTokenScreen extends Component { const { network } = this.props const networkID = parseInt(network) let views = [] - const isProdNetwork = networkID === 1 || networkID === 99 - isProdNetwork ? views = [h(TabBar, { + const isProdNetworkWithKnownTokens = networkID === MAINNET_CODE || + networkID === POA_CODE + isProdNetworkWithKnownTokens ? views = [h(TabBar, { style: { paddingTop: '0px', }, diff --git a/old-ui/app/components/app-bar.js b/old-ui/app/components/app-bar.js index 42449b28c..aefa3a4e9 100644 --- a/old-ui/app/components/app-bar.js +++ b/old-ui/app/components/app-bar.js @@ -9,6 +9,9 @@ const NetworkIndicator = require('./network') const {AccountDropdowns} = require('./account-dropdowns') const ethNetProps = require('eth-net-props') +const { LOCALHOST } = require('../../../app/scripts/controllers/network/enums') +const { networks } = require('../../../app/scripts/controllers/network/util') + const LOCALHOST_RPC_URL = 'http://localhost:8545' module.exports = class AppBar extends Component { @@ -243,6 +246,35 @@ module.exports = class AppBar extends Component { const state = this.state || {} const isOpen = state.isNetworkMenuOpen + const networkDropdownItems = Object.keys(networks) + .filter((networkID) => { + return !isNaN(networkID) + }) + .sort((networkID1, networkID2) => { + const networkObj1 = networks[networkID1] + const networkObj2 = networks[networkID2] + return networkObj1.order - networkObj2.order + }) + .map((networkID) => { + const networkObj = networks[networkID] + return h( + DropdownMenuItem, + { + key: networkObj.providerName, + closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), + onClick: () => props.dispatch(actions.setProviderType(networkObj.providerName)), + style: { + paddingLeft: '20px', + fontSize: '16px', + color: providerType === networkObj.providerName ? 'white' : '', + }, + }, + [h(providerType === networkObj.providerName ? 'div.selected-network' : ''), + ethNetProps.props.getNetworkDisplayName(networkID), + ] + ) + }) + return h(Dropdown, { useCssTransition: true, isOpen, @@ -272,124 +304,7 @@ module.exports = class AppBar extends Component { }, }, [ - h( - DropdownMenuItem, - { - key: 'poa', - closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), - onClick: () => props.dispatch(actions.setProviderType('poa')), - style: { - paddingLeft: '20px', - fontSize: '16px', - color: providerType === 'poa' ? 'white' : '', - }, - }, - [h(providerType === 'poa' ? 'div.selected-network' : ''), - ethNetProps.props.getNetworkDisplayName(99), - ] - ), - - h( - DropdownMenuItem, - { - key: 'dai', - closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), - onClick: () => props.dispatch(actions.setProviderType('dai')), - style: { - paddingLeft: '20px', - fontSize: '16px', - color: providerType === 'dai' ? 'white' : '', - }, - }, - [h(providerType === 'dai' ? 'div.selected-network' : ''), - ethNetProps.props.getNetworkDisplayName(100), - ] - ), - - h( - DropdownMenuItem, - { - key: 'sokol', - closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), - onClick: () => props.dispatch(actions.setProviderType('sokol')), - style: { - paddingLeft: '20px', - fontSize: '16px', - color: providerType === 'sokol' ? 'white' : '', - }, - }, - [h(providerType === 'sokol' ? 'div.selected-network' : ''), - ethNetProps.props.getNetworkDisplayName(77), - ] - ), - - h( - DropdownMenuItem, - { - key: 'main', - closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), - onClick: () => props.dispatch(actions.setProviderType('mainnet')), - style: { - paddingLeft: '20px', - fontSize: '16px', - color: providerType === 'mainnet' ? 'white' : '', - }, - }, - [h(providerType === 'mainnet' ? 'div.selected-network' : ''), - ethNetProps.props.getNetworkDisplayName(1), - ] - ), - - h( - DropdownMenuItem, - { - key: 'ropsten', - closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), - onClick: () => props.dispatch(actions.setProviderType('ropsten')), - style: { - paddingLeft: '20px', - fontSize: '16px', - color: providerType === 'ropsten' ? 'white' : '', - }, - }, - [h(providerType === 'ropsten' ? 'div.selected-network' : ''), - ethNetProps.props.getNetworkDisplayName(3), - ] - ), - - h( - DropdownMenuItem, - { - key: 'kovan', - closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), - onClick: () => props.dispatch(actions.setProviderType('kovan')), - style: { - paddingLeft: '20px', - fontSize: '16px', - color: providerType === 'kovan' ? 'white' : '', - }, - }, - [h(providerType === 'kovan' ? 'div.selected-network' : ''), - ethNetProps.props.getNetworkDisplayName(42), - ] - ), - - h( - DropdownMenuItem, - { - key: 'rinkeby', - closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), - onClick: () => props.dispatch(actions.setProviderType('rinkeby')), - style: { - paddingLeft: '20px', - fontSize: '16px', - color: providerType === 'rinkeby' ? 'white' : '', - }, - }, - [h(providerType === 'rinkeby' ? 'div.selected-network' : ''), - ethNetProps.props.getNetworkDisplayName(4), - ] - ), + ...networkDropdownItems, h( DropdownMenuItem, @@ -398,15 +313,15 @@ module.exports = class AppBar extends Component { closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), onClick: () => { props.dispatch(actions.setRpcTarget('http://localhost:8545')) - props.dispatch(actions.setProviderType('localhost')) + props.dispatch(actions.setProviderType(LOCALHOST)) }, style: { paddingLeft: '20px', fontSize: '16px', - color: providerType === 'localhost' ? 'white' : '', + color: providerType === LOCALHOST ? 'white' : '', }, }, - [h(providerType === 'localhost' ? 'div.selected-network' : ''), + [h(providerType === LOCALHOST ? 'div.selected-network' : ''), 'Localhost 8545', ] ), diff --git a/old-ui/app/components/buy-button-subview.js b/old-ui/app/components/buy-button-subview.js index b6205c5a5..a367c2d54 100644 --- a/old-ui/app/components/buy-button-subview.js +++ b/old-ui/app/components/buy-button-subview.js @@ -8,6 +8,7 @@ import AccountPanel from './account-panel' import RadioList from './custom-radio-list' import { getNetworkDisplayName } from '../../../app/scripts/controllers/network/util' import { getFaucets, getExchanges } from '../../../app/scripts/lib/buy-eth-url' +import { MAINNET_CODE } from '../../../app/scripts/controllers/network/enums' import ethNetProps from 'eth-net-props' import PropTypes from 'prop-types' @@ -157,8 +158,8 @@ class BuyButtonSubview extends Component { } formVersionSubview () { - const network = this.props.network - if (network === '1') { + const { network } = this.props + if (Number(network) === MAINNET_CODE) { if (this.props.buyView.formView.coinbase) { return } else if (this.props.buyView.formView.shapeshift) { diff --git a/old-ui/app/components/fiat-value.js b/old-ui/app/components/fiat-value.js index 96d6cbb43..63a83d133 100644 --- a/old-ui/app/components/fiat-value.js +++ b/old-ui/app/components/fiat-value.js @@ -1,14 +1,15 @@ import React, { Component } from 'react' import { formatBalance, countSignificantDecimals } from '../util' import PropTypes from 'prop-types' +import { DAI_CODE, POA_SOKOL_CODE } from '../../../app/scripts/controllers/network/enums' class FiatValue extends Component { render = () => { const props = this.props let { conversionRate } = props const { currentCurrency, network } = props - const isSokol = parseInt(network) === 77 - const isDai = parseInt(network) === 100 + const isSokol = parseInt(network) === POA_SOKOL_CODE + const isDai = parseInt(network) === DAI_CODE if (isSokol) { conversionRate = 0 } else if (isDai) { diff --git a/old-ui/app/components/network.js b/old-ui/app/components/network.js index 3c30e6b2c..760014a0c 100644 --- a/old-ui/app/components/network.js +++ b/old-ui/app/components/network.js @@ -2,15 +2,7 @@ const Component = require('react').Component const h = require('react-hyperscript') const inherits = require('util').inherits const ethNetProps = require('eth-net-props') -const { - DROPDOWN_ROPSTEN_DISPLAY_NAME, - DROPDOWN_RINKEBY_DISPLAY_NAME, - DROPDOWN_KOVAN_DISPLAY_NAME, - DROPDOWN_POA_SOKOL_DISPLAY_NAME, - DROPDOWN_POA_DISPLAY_NAME, - DROPDOWN_DAI_DISPLAY_NAME, - DROPDOWN_MAINNET_DISPLAY_NAME, -} = require('../../../app/scripts/controllers/network/enums') +const { networks } = require('../../../app/scripts/controllers/network/util') module.exports = Network @@ -23,12 +15,6 @@ function Network () { Network.prototype.render = function () { const props = this.props const { provider, network: networkNumber } = props - let providerName - try { - providerName = provider.type - } catch (e) { - providerName = null - } let displayName, hoverText if (networkNumber === 'loading') { @@ -51,26 +37,8 @@ Network.prototype.render = function () { h('i.fa.fa-caret-down'), ]) } else { - if (providerName === 'mainnet' || parseInt(networkNumber) === 1) { - displayName = DROPDOWN_MAINNET_DISPLAY_NAME - hoverText = ethNetProps.props.getNetworkDisplayName(networkNumber) - } else if (providerName === 'ropsten' || parseInt(networkNumber) === 3) { - displayName = DROPDOWN_ROPSTEN_DISPLAY_NAME - hoverText = ethNetProps.props.getNetworkDisplayName(networkNumber) - } else if (providerName === 'sokol' || parseInt(networkNumber) === 77) { - displayName = DROPDOWN_POA_SOKOL_DISPLAY_NAME - hoverText = ethNetProps.props.getNetworkDisplayName(networkNumber) - } else if (providerName === 'kovan' || parseInt(networkNumber) === 42) { - displayName = DROPDOWN_KOVAN_DISPLAY_NAME - hoverText = ethNetProps.props.getNetworkDisplayName(networkNumber) - } else if (providerName === 'rinkeby' || parseInt(networkNumber) === 4) { - displayName = DROPDOWN_RINKEBY_DISPLAY_NAME - hoverText = ethNetProps.props.getNetworkDisplayName(networkNumber) - } else if (providerName === 'poa' || parseInt(networkNumber) === 99) { - displayName = DROPDOWN_POA_DISPLAY_NAME - hoverText = ethNetProps.props.getNetworkDisplayName(networkNumber) - } else if (providerName === 'dai' || parseInt(networkNumber) === 100) { - displayName = DROPDOWN_DAI_DISPLAY_NAME + if (networkNumber && networks[networkNumber]) { + displayName = networks[networkNumber].displayNameDropdown hoverText = ethNetProps.props.getNetworkDisplayName(networkNumber) } else { displayName = 'Private Network' diff --git a/old-ui/app/components/send/send-contract.js b/old-ui/app/components/send/send-contract.js index 1d93ff52c..f97c7309d 100644 --- a/old-ui/app/components/send/send-contract.js +++ b/old-ui/app/components/send/send-contract.js @@ -387,7 +387,6 @@ class SendTransactionScreen extends PersistentForm { } setOutputValue = (val, type) => { - console.log(val) if (!type) { return val || '' } diff --git a/old-ui/app/components/token-cell.js b/old-ui/app/components/token-cell.js index bc82f4d07..c311be35d 100644 --- a/old-ui/app/components/token-cell.js +++ b/old-ui/app/components/token-cell.js @@ -9,6 +9,7 @@ const ethUtil = require('ethereumjs-util') const copyToClipboard = require('copy-to-clipboard') const actions = require('../../../ui/app/actions') const connect = require('react-redux').connect +const { MAINNET_CODE } = require('../../../app/scripts/controllers/network/enums') import { countSignificantDecimals } from '../util' const tokenCellDropDownPrefix = 'token-cell_dropdown_' @@ -33,7 +34,7 @@ TokenCell.prototype.render = function () { return ( h(`li#token-cell_${ind}.token-cell`, { style: { - cursor: network === '1' ? 'pointer' : 'default', + cursor: Number(network) === MAINNET_CODE ? 'pointer' : 'default', borderBottom: isLastTokenCell ? 'none' : '1px solid #e2e2e2', padding: '20px 0', margin: '0 30px', diff --git a/old-ui/app/components/transaction-list-item.js b/old-ui/app/components/transaction-list-item.js index dd681e072..2ae3d03fa 100644 --- a/old-ui/app/components/transaction-list-item.js +++ b/old-ui/app/components/transaction-list-item.js @@ -15,6 +15,16 @@ const ethNetProps = require('eth-net-props') const TransactionIcon = require('./transaction-list-item-icon') const ShiftListItem = require('./shift-list-item') +const { POA_CODE, + DAI_CODE, + POA_SOKOL_CODE, + MAINNET_CODE, + ROPSTEN_CODE, + RINKEBY_CODE, + KOVAN_CODE, + RSK_CODE, + RSK_TESTNET_CODE } = require('../../../app/scripts/controllers/network/enums') + const mapDispatchToProps = dispatch => { return { retryTransaction: transactionId => dispatch(actions.retryTransaction(transactionId)), @@ -59,13 +69,21 @@ TransactionListItem.prototype.render = function () { const { transaction, network, conversionRate, currentCurrency } = this.props const { status } = transaction if (transaction.key === 'shapeshift') { - if (network === '1') return h(ShiftListItem, transaction) + if (Number(network) === MAINNET_CODE) return h(ShiftListItem, transaction) } var date = formatDate(transaction.time) let isLinkable = false const numericNet = parseInt(network) - isLinkable = numericNet === 1 || numericNet === 3 || numericNet === 4 || numericNet === 42 || numericNet === 77 || numericNet === 99 || numericNet === 100 + isLinkable = numericNet === MAINNET_CODE || + numericNet === ROPSTEN_CODE || + numericNet === RINKEBY_CODE || + numericNet === KOVAN_CODE || + numericNet === POA_SOKOL_CODE || + numericNet === POA_CODE || + numericNet === DAI_CODE || + numericNet === RSK_CODE || + numericNet === RSK_TESTNET_CODE var isMsg = ('msgParams' in transaction) var isTx = ('txParams' in transaction) diff --git a/old-ui/app/components/transaction-list.js b/old-ui/app/components/transaction-list.js index 8cd6e776d..762f5c0ac 100644 --- a/old-ui/app/components/transaction-list.js +++ b/old-ui/app/components/transaction-list.js @@ -3,6 +3,7 @@ const h = require('react-hyperscript') const inherits = require('util').inherits const TransactionListItem = require('./transaction-list-item') +const { MAINNET_CODE } = require('../../../app/scripts/controllers/network/enums') module.exports = TransactionList @@ -16,7 +17,7 @@ TransactionList.prototype.render = function () { const { transactions, network, unapprovedMsgs, conversionRate } = this.props var shapeShiftTxList - if (network === '1') { + if (Number(network) === MAINNET_CODE) { shapeShiftTxList = this.props.shapeShiftTxList } const txsToRender = !shapeShiftTxList ? transactions.concat(unapprovedMsgs) : transactions.concat(unapprovedMsgs, shapeShiftTxList) diff --git a/old-ui/app/conf-tx.js b/old-ui/app/conf-tx.js index da5321579..2ed13bfe6 100644 --- a/old-ui/app/conf-tx.js +++ b/old-ui/app/conf-tx.js @@ -13,6 +13,7 @@ import PendingMsg from './components/pending-msg' import PendingPersonalMsg from './components/pending-personal-msg' import PendingTypedMsg from './components/pending-typed-msg' const Loading = require('./components/loading') +const { DAI_CODE, POA_SOKOL_CODE } = require('../../app/scripts/controllers/network/enums') module.exports = connect(mapStateToProps)(ConfirmTxScreen) @@ -55,8 +56,8 @@ ConfirmTxScreen.prototype.render = function () { unapprovedMsgs, unapprovedPersonalMsgs, unapprovedTypedMessages, blockGasLimit } = props let { conversionRate } = props - const isSokol = parseInt(network) === 77 - const isDai = parseInt(network) === 100 + const isSokol = parseInt(network) === POA_SOKOL_CODE + const isDai = parseInt(network) === DAI_CODE if (isSokol) { conversionRate = 0 } else if (isDai) { diff --git a/old-ui/app/config.js b/old-ui/app/config.js index d6284067e..3b27a6c7e 100644 --- a/old-ui/app/config.js +++ b/old-ui/app/config.js @@ -12,6 +12,7 @@ const validUrl = require('valid-url') 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') module.exports = connect(mapStateToProps)(ConfigScreen) @@ -290,46 +291,12 @@ function currentProviderDisplay (metamaskState, state) { const provider = metamaskState.provider let title, value - switch (provider.type) { - - case 'mainnet': - title = 'Current Network' - value = ethNetProps.props.getNetworkDisplayName(1) - break - - case 'sokol': - title = 'Current Network' - value = ethNetProps.props.getNetworkDisplayName(77) - break - - case 'ropsten': - title = 'Current Network' - value = ethNetProps.props.getNetworkDisplayName(3) - break - - case 'kovan': - title = 'Current Network' - value = ethNetProps.props.getNetworkDisplayName(42) - break - - case 'rinkeby': - title = 'Current Network' - value = ethNetProps.props.getNetworkDisplayName(4) - break - - case 'poa': - title = 'Current Network' - value = ethNetProps.props.getNetworkDisplayName(99) - break - - case 'dai': - title = 'Current Network' - value = ethNetProps.props.getNetworkDisplayName(100) - break - - default: - title = 'Current RPC' - value = metamaskState.provider.rpcTarget + if (networks[provider.type]) { + title = 'Current Network' + value = ethNetProps.props.getNetworkDisplayName(networks[provider.type].networkID) + } else { + title = 'Current RPC' + value = metamaskState.provider.rpcTarget } return h('div', [ diff --git a/package-lock.json b/package-lock.json index 9dec75064..3ae704e25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10540,6 +10540,7 @@ "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "requires": { + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", "ethereumjs-util": "^5.1.1" } }, @@ -10713,9 +10714,9 @@ } }, "eth-net-props": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/eth-net-props/-/eth-net-props-1.0.10.tgz", - "integrity": "sha512-sCKttmHUFficRcyx95CWUW2AuvQ6rEboy4XcoR49HU7UNMxOdRti3rFyGrkVepRozn1bLLjet/doPKnj8rDG7g==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/eth-net-props/-/eth-net-props-1.0.11.tgz", + "integrity": "sha512-D5BJCoRAf0Q40X4tb0IN8goZTddYwtKqRBYklglS36iPd0qXu183NktYJ63e+1dLzeBG5vvkqN9LXW9CbLxhOQ==", "requires": { "chai": "^4.1.2" } @@ -14994,7 +14995,8 @@ "bindings": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", - "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", + "dev": true }, "bip39": { "version": "2.5.0", @@ -15013,6 +15015,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -15047,7 +15050,8 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true }, "body-parser": { "version": "1.18.3", @@ -15090,12 +15094,14 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true }, "browserify-aes": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -15252,7 +15258,8 @@ "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true }, "builtin-modules": { "version": "1.1.1", @@ -15350,6 +15357,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -15509,6 +15517,7 @@ "version": "1.2.0", "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -15521,6 +15530,7 @@ "version": "1.1.7", "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -15820,6 +15830,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", + "dev": true, "requires": { "browserify-aes": "^1.0.6", "create-hash": "^1.1.2", @@ -15858,6 +15869,7 @@ "version": "6.4.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -16169,14 +16181,6 @@ "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", "dev": true }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" - } - }, "ethereumjs-block": { "version": "1.7.1", "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", @@ -16366,6 +16370,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "dev": true, "requires": { "bn.js": "^4.11.0", "create-hash": "^1.1.2", @@ -16455,6 +16460,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, "requires": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -16476,6 +16482,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -16886,6 +16893,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -16895,6 +16903,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -16922,6 +16931,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -17089,7 +17099,8 @@ "is-hex-prefixed": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", + "dev": true }, "is-natural-number": { "version": "4.0.1", @@ -17290,6 +17301,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "dev": true, "requires": { "bindings": "^1.2.1", "inherits": "^2.0.3", @@ -17589,6 +17601,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -17748,12 +17761,14 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true }, "minimatch": { "version": "3.0.4", @@ -17823,7 +17838,8 @@ "nan": { "version": "2.10.0", "resolved": "http://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true }, "nano-json-stream-parser": { "version": "0.1.2", @@ -18490,6 +18506,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -18499,6 +18516,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.1.0.tgz", "integrity": "sha512-93U7IKH5j7nmXFVg19MeNBGzQW5uXW1pmCuKY8veeKIhYTE32C2d0mOegfiIAfXcHOKJjjPlJisn8iHDF5AezA==", + "dev": true, "requires": { "safe-buffer": "^5.1.1" } @@ -18512,7 +18530,8 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safe-event-emitter": { "version": "1.0.1", @@ -18564,6 +18583,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.5.2.tgz", "integrity": "sha512-iin3kojdybY6NArd+UFsoTuapOF7bnJNf2UbcWXaY3z+E1sJDipl60vtzB5hbO/uquBu7z0fd4VC4Irp+xoFVQ==", + "dev": true, "requires": { "bindings": "^1.2.1", "bip66": "^1.1.3", @@ -18695,6 +18715,7 @@ "version": "2.4.11", "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -18905,6 +18926,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "dev": true, "requires": { "is-hex-prefixed": "1.0.0" } diff --git a/package.json b/package.json index c3b99331d..ae330e188 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "eth-keychain-controller": "github:vbaranov/KeyringController#simple-address", "eth-ledger-bridge-keyring": "^0.1.0", "eth-method-registry": "^1.0.0", - "eth-net-props": "^1.0.10", + "eth-net-props": "^1.0.11", "eth-phishing-detect": "^1.1.4", "eth-query": "^2.1.2", "eth-sig-util": "^2.0.2", diff --git a/test/e2e/elements.js b/test/e2e/elements.js index d28239882..2e5ce3889 100644 --- a/test/e2e/elements.js +++ b/test/e2e/elements.js @@ -382,6 +382,8 @@ module.exports = { ROPSTEN: 'ropsten', KOVAN: 'kovan', RINKEBY: 'rinkeby', + RSK: 'rsk', + RSK_TESTNET: 'rsk_testnet', LOCALHOST: 'localhost', CUSTOM: 'http://test.com', }, diff --git a/test/e2e/func.js b/test/e2e/func.js index 7c983cbf0..62344bb82 100644 --- a/test/e2e/func.js +++ b/test/e2e/func.js @@ -132,14 +132,20 @@ class Functions { case NETWORKS.RINKEBY: counter = 6 break - case NETWORKS.LOCALHOST: + case NETWORKS.RSK: counter = 7 break - case NETWORKS.CUSTOM: + case NETWORKS.RSK_TESTNET: counter = 8 break + case NETWORKS.LOCALHOST: + counter = 9 + break + case NETWORKS.CUSTOM: + counter = 10 + break default: - counter = 7 + counter = 9 } await this.driver.executeScript("document.getElementsByClassName('dropdown-menu-item')[" + counter + '].click();') } diff --git a/test/e2e/metamask.spec.js b/test/e2e/metamask.spec.js index 3f99c2a49..83fd24fed 100644 --- a/test/e2e/metamask.spec.js +++ b/test/e2e/metamask.spec.js @@ -2420,7 +2420,7 @@ describe('Metamask popup page', async function () { await f.clearField(fieldRpc) await fieldRpc.sendKeys(correctRpcUrl + 0) await driver.findElement(screens.settings.buttonSave).click() - await f.delay(10000) + await f.delay(20000) const customUrlElement = await f.waitUntilShowUp(screens.settings.currentNetwork) assert.equal(await customUrlElement.getText(), correctRpcUrl + 0, 'Added Url doesn\'t match') }) From 966060868f26eb583d09a0abf36dc7176f05c3f0 Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Thu, 10 Jan 2019 20:24:02 +0300 Subject: [PATCH 2/8] make RSK testnet tx is not clickable --- old-ui/app/components/transaction-list-item.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/old-ui/app/components/transaction-list-item.js b/old-ui/app/components/transaction-list-item.js index 2ae3d03fa..dd57d9e91 100644 --- a/old-ui/app/components/transaction-list-item.js +++ b/old-ui/app/components/transaction-list-item.js @@ -82,8 +82,7 @@ TransactionListItem.prototype.render = function () { numericNet === POA_SOKOL_CODE || numericNet === POA_CODE || numericNet === DAI_CODE || - numericNet === RSK_CODE || - numericNet === RSK_TESTNET_CODE + numericNet === RSK_CODE var isMsg = ('msgParams' in transaction) var isTx = ('txParams' in transaction) From 8ca839d45d6a38f1293fb9b19453863a5bc67826 Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Thu, 10 Jan 2019 20:26:39 +0300 Subject: [PATCH 3/8] ESLint fix --- old-ui/app/components/transaction-list-item.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/old-ui/app/components/transaction-list-item.js b/old-ui/app/components/transaction-list-item.js index dd57d9e91..bd2227827 100644 --- a/old-ui/app/components/transaction-list-item.js +++ b/old-ui/app/components/transaction-list-item.js @@ -22,8 +22,7 @@ const { POA_CODE, ROPSTEN_CODE, RINKEBY_CODE, KOVAN_CODE, - RSK_CODE, - RSK_TESTNET_CODE } = require('../../../app/scripts/controllers/network/enums') + RSK_CODE } = require('../../../app/scripts/controllers/network/enums') const mapDispatchToProps = dispatch => { return { From 97c347ee2d74fc5ca8ba22f0f09a721068b18723 Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Thu, 10 Jan 2019 21:01:33 +0300 Subject: [PATCH 4/8] RBTC exchange rate for mainnet and 0 exchange rate for testnet --- app/scripts/controllers/currency.js | 2 +- old-ui/app/components/fiat-value.js | 6 +++--- old-ui/app/conf-tx.js | 6 +++--- ui/app/actions.js | 10 +++++++++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/scripts/controllers/currency.js b/app/scripts/controllers/currency.js index 00e6ef117..4929de052 100644 --- a/app/scripts/controllers/currency.js +++ b/app/scripts/controllers/currency.js @@ -130,7 +130,7 @@ class CurrencyController { currentCurrency = this.getCurrentCurrency() currentCoin = this.getCurrentCoin() let conversionRate, conversionDate - if (currentCoin === 'poa') { + if (currentCoin === 'poa' || currentCoin === 'rbtc') { const coinId = await this.getCoinMarketCapId(currentCoin) const response = await fetch(`https://api.coinmarketcap.com/v2/ticker/${coinId}/?convert=${currentCurrency.toLowerCase()}`) const parsedResponse = await response.json() diff --git a/old-ui/app/components/fiat-value.js b/old-ui/app/components/fiat-value.js index 63a83d133..ee56e201b 100644 --- a/old-ui/app/components/fiat-value.js +++ b/old-ui/app/components/fiat-value.js @@ -1,16 +1,16 @@ import React, { Component } from 'react' import { formatBalance, countSignificantDecimals } from '../util' import PropTypes from 'prop-types' -import { DAI_CODE, POA_SOKOL_CODE } from '../../../app/scripts/controllers/network/enums' +import { DAI_CODE, POA_SOKOL_CODE, RSK_TESTNET_CODE } from '../../../app/scripts/controllers/network/enums' class FiatValue extends Component { render = () => { const props = this.props let { conversionRate } = props const { currentCurrency, network } = props - const isSokol = parseInt(network) === POA_SOKOL_CODE + const isTestnet = parseInt(network) === POA_SOKOL_CODE || parseInt(network) === RSK_TESTNET_CODE const isDai = parseInt(network) === DAI_CODE - if (isSokol) { + if (isTestnet) { conversionRate = 0 } else if (isDai) { conversionRate = 1 diff --git a/old-ui/app/conf-tx.js b/old-ui/app/conf-tx.js index 2ed13bfe6..e54c4786b 100644 --- a/old-ui/app/conf-tx.js +++ b/old-ui/app/conf-tx.js @@ -13,7 +13,7 @@ import PendingMsg from './components/pending-msg' import PendingPersonalMsg from './components/pending-personal-msg' import PendingTypedMsg from './components/pending-typed-msg' const Loading = require('./components/loading') -const { DAI_CODE, POA_SOKOL_CODE } = require('../../app/scripts/controllers/network/enums') +const { DAI_CODE, POA_SOKOL_CODE, RSK_TESTNET_CODE } = require('../../app/scripts/controllers/network/enums') module.exports = connect(mapStateToProps)(ConfirmTxScreen) @@ -56,9 +56,9 @@ ConfirmTxScreen.prototype.render = function () { unapprovedMsgs, unapprovedPersonalMsgs, unapprovedTypedMessages, blockGasLimit } = props let { conversionRate } = props - const isSokol = parseInt(network) === POA_SOKOL_CODE + const isTestnet = parseInt(network) === POA_SOKOL_CODE || parseInt(network) === RSK_TESTNET_CODE const isDai = parseInt(network) === DAI_CODE - if (isSokol) { + if (isTestnet) { conversionRate = 0 } else if (isDai) { conversionRate = 1 diff --git a/ui/app/actions.js b/ui/app/actions.js index 03419e0c2..13b366534 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -11,6 +11,11 @@ const ethUtil = require('ethereumjs-util') const { fetchLocale } = require('../i18n-helper') const log = require('loglevel') const { ENVIRONMENT_TYPE_NOTIFICATION } = require('../../app/scripts/lib/enums') +const { POA, + DAI, + POA_SOKOL, + RSK, + RSK_TESTNET } = require('../../app/scripts/controllers/network/enums') const { hasUnconfirmedTransactions } = require('./helpers/confirm-transaction/util') const WebcamUtils = require('../lib/webcam-utils') @@ -1959,7 +1964,10 @@ function setProviderType (type) { dispatch(actions.setSelectedToken()) }) - const newCoin = type === 'poa' || type === 'sokol' ? 'poa' : type === 'dai' ? 'dai' : 'eth' + const newCoin = type === POA || type === POA_SOKOL ? + 'poa' : type === DAI ? + 'dai' : type === RSK || type === RSK_TESTNET ? + 'rbtc' : 'eth' background.setCurrentCoin(newCoin, (err, data) => { if (err) { log.error(err.stack) From 2f8afe3af338a2c0680361963210995952982175 Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Fri, 11 Jan 2019 16:17:27 +0300 Subject: [PATCH 5/8] e2e tests update to support RSK network, `buy Ether` button is renamed to `buy ${coinName}`, style fix of error in Buy screen --- app/scripts/lib/buy-eth-url.js | 15 ++ old-ui/app/components/buy-button-subview.js | 2 +- old-ui/app/components/pending-tx.js | 6 +- test/e2e/elements.js | 5 + test/e2e/metamask.spec.js | 204 ++++++++++++++++---- 5 files changed, 188 insertions(+), 44 deletions(-) diff --git a/app/scripts/lib/buy-eth-url.js b/app/scripts/lib/buy-eth-url.js index 9bb09885b..37444e16d 100644 --- a/app/scripts/lib/buy-eth-url.js +++ b/app/scripts/lib/buy-eth-url.js @@ -97,6 +97,21 @@ function getExchanges ({network, amount, address}) { link: 'https://dai-bridge.poa.network/', }, ] + case 30: + return [ + { + name: 'Huobi', + link: 'https://www.huobi.com/', + }, + { + name: 'Bitfinex', + link: 'https://www.bitfinex.com/', + }, + { + name: 'Bitso', + link: 'https://bitso.com/', + }, + ] default: return [] } diff --git a/old-ui/app/components/buy-button-subview.js b/old-ui/app/components/buy-button-subview.js index a367c2d54..5551d143e 100644 --- a/old-ui/app/components/buy-button-subview.js +++ b/old-ui/app/components/buy-button-subview.js @@ -79,7 +79,7 @@ class BuyButtonSubview extends Component { default: return ( -
+
{ this._getBuyOptionsView(network) }
) diff --git a/old-ui/app/components/pending-tx.js b/old-ui/app/components/pending-tx.js index 521711f99..42c06f316 100644 --- a/old-ui/app/components/pending-tx.js +++ b/old-ui/app/components/pending-tx.js @@ -24,13 +24,14 @@ const connect = require('react-redux').connect const abiDecoder = require('abi-decoder') const { tokenInfoGetter, calcTokenAmount } = require('../../../ui/app/token-util') const BigNumber = require('bignumber.js') +const ethNetProps = require('eth-net-props') const MIN_GAS_PRICE_BN = new BN('0') const MIN_GAS_LIMIT_BN = new BN('21000') module.exports = connect(mapStateToProps)(PendingTx) inherits(PendingTx, Component) -function PendingTx () { +function PendingTx (props) { Component.call(this) this.state = { valid: true, @@ -39,6 +40,7 @@ function PendingTx () { tokenSymbol: '', tokenDecimals: 0, tokenDataRetrieved: false, + coinName: ethNetProps.props.getNetworkCoinName(props.network), } this.tokenInfoGetter = tokenInfoGetter() } @@ -504,7 +506,7 @@ PendingTx.prototype.render = function () { }, 'Reset'), // Accept Button or Buy Button - insufficientBalance ? h('button.btn-green', { onClick: props.buyEth }, 'Buy Ether') : + insufficientBalance ? h('button.btn-green', { onClick: props.buyEth }, `Buy ${this.state.coinName}`) : h('input.confirm', { type: 'submit', value: 'Submit', diff --git a/test/e2e/elements.js b/test/e2e/elements.js index 2e5ce3889..238764eac 100644 --- a/test/e2e/elements.js +++ b/test/e2e/elements.js @@ -282,6 +282,8 @@ module.exports = { buttons: { send: By.css('#app-content > div > div.app-primary.from-right > div > div > div.flex-row > button:nth-child(4)'), buy: By.css('#app-content > div > div.app-primary.from-right > div > div > div.flex-row > button:nth-child(3)'), + sendRSK: By.css('#app-content > div > div.app-primary.from-left > div > div > div.flex-row > button:nth-child(4)'), + buyRSK: By.css('#app-content > div > div.app-primary.from-left > div > div > div.flex-row > button:nth-child(3)'), sendText: 'Send', save: By.className('editable-button'), }, @@ -292,6 +294,7 @@ module.exports = { }, // balance: By.css('#app-content > div > div.app-primary.from-right > div > div > div.flex-row > div.ether-balance.ether-balance-amount > div > div > div:nth-child(1) > div:nth-child(1)'), balance: By.xpath('//*[@id="app-content"]/div/div[2]/div/div/div[2]/div[1]/div/div/div[1]/div[1]'), + balanceUSD: By.xpath('//*[@id="app-content"]/div/div[2]/div/div/div[2]/div[1]/div/div/div[2]/div[1]'), address: By.css('#app-content > div > div.app-primary.from-left > div > div > div:nth-child(1) > flex-column > div.flex-row > div'), tokens: { menu: By.id('wallet-view__tab-tokens'), @@ -308,6 +311,8 @@ module.exports = { }, buyEther: { title: By.className('flex-center buy-title'), + faucetLinkRSK: By.className('buy-option cursor-pointer'), + buttonArrow: By.className('fa fa-arrow-left fa-lg cursor-pointer'), }, info: { title: By.className('section-title flex-row flex-center'), diff --git a/test/e2e/metamask.spec.js b/test/e2e/metamask.spec.js index 83fd24fed..0879a263c 100644 --- a/test/e2e/metamask.spec.js +++ b/test/e2e/metamask.spec.js @@ -977,6 +977,7 @@ describe('Metamask popup page', async function () { it('User is able to select account', async function () { await f.waitUntilShowUp(screens.chooseContractExecutor.account) const accounts = await driver.findElements(screens.chooseContractExecutor.account) + await f.delay(1000) const account = accounts[1] await account.click() const selected = await driver.findElements(screens.chooseContractExecutor.selectedAccount) @@ -998,17 +999,17 @@ describe('Metamask popup page', async function () { assert.notEqual(reject, false, "button reject isn't displayed") }) - it("Button 'Buy Ether' is displayed", async function () { + it("Button 'Buy POA' is displayed", async function () { const button = await f.waitUntilShowUp(screens.confirmTransaction.button.buyEther) - assert.equal(await button.getText(), 'Buy Ether', 'button has incorrect name') + assert.equal(await button.getText(), 'Buy POA', 'button has incorrect name') assert.equal(await button.isEnabled(), true, 'button is disabled') }) - it("Open screen 'Buy Ether'", async function () { + it("Open screen 'Buy'", async function () { const button = await f.waitUntilShowUp(screens.confirmTransaction.button.buyEther) await button.click() const title = await f.waitUntilShowUp(screens.buyEther.title) - assert.equal(await title.getText(), 'Buy POA', "screen 'Buy Ether' has incorrect title text") + assert.equal(await title.getText(), 'Buy POA', "screen 'Buy POA' has incorrect title text") const arrow = await f.waitUntilShowUp(elements.buttonArrow) await arrow.click() }) @@ -1340,6 +1341,92 @@ describe('Metamask popup page', async function () { }) }) + describe('RSK network tests', async function () { + 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('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 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 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 driver.getAllWindowHandles() + await driver.switchTo().window(tab1) + const faucetLink = await driver.getCurrentUrl() + assert.equal(faucetLink, 'https://faucet.testnet.rsk.co/', 'Incorrect faucet link for RSK network') + await driver.close() + await 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('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('31500') + 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') + }) + }) + describe('Check the filter of emitted events', async function () { it('emit event', async function () { @@ -1537,35 +1624,45 @@ describe('Metamask popup page', async function () { const inexistentToken = '0xB8c77482e45F1F44dE1745F52C74426C631bDD51' describe('Token should be displayed only for network, where it was added ', async function () { - it('token should not be displayed in POA network', async function () { + it('token should not be displayed in POA network', async function () { await f.setProvider(NETWORKS.POA) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - it('token should not be displayed in SOKOL network', async function () { + it('token should not be displayed in SOKOL network', async function () { await f.setProvider(NETWORKS.SOKOL) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - it('token should not be displayed in MAINNET network', async function () { + it('token should not be displayed in MAINNET network', async function () { await f.setProvider(NETWORKS.MAINNET) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - it('token should not be displayed in ROPSTEN network', async function () { + it('token should not be displayed in ROPSTEN network', async function () { await f.setProvider(NETWORKS.ROPSTEN) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - it('token should not be displayed in KOVAN network', async function () { + it('token should not be displayed in KOVAN network', async function () { await f.setProvider(NETWORKS.KOVAN) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - it('token should not be displayed in RINKEBY network', async function () { + it('token should not be displayed in RINKEBY network', async function () { await f.setProvider(NETWORKS.RINKEBY) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) + + it('token should not be displayed in RSK network', async function () { + await f.setProvider(NETWORKS.RSK) + assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') + }) + + it('token should not be displayed in RSK testnet', async function () { + await f.setProvider(NETWORKS.RSK_TESTNET) + assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') + }) }) describe('Custom tokens validation ', async function () { @@ -1576,29 +1673,44 @@ describe('Metamask popup page', async function () { assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in POA network') }) - it('can not add inexistent token to SOKOL network', async function () { + it('can not add inexistent token to DAI network', async function () { + await f.setProvider(NETWORKS.DAI) + assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in DAI network') + }) + + it('can not add inexistent token to SOKOL testnet', async function () { await f.setProvider(NETWORKS.SOKOL) - assert(await f.isDisabledAddInexistentToken(inexistentToken), true, 'can add inexistent token in POA network') + assert(await f.isDisabledAddInexistentToken(inexistentToken), true, 'can add inexistent token in POA Sokol testnet') }) - it('can not add inexistent token to ROPSTEN network', async function () { - await f.setProvider(NETWORKS.ROPSTEN) - assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in POA network') - }) - - it('can not add inexistent token to KOVAN network', async function () { - await f.setProvider(NETWORKS.KOVAN) - assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in POA network') - }) - - it('can not add inexistent token to RINKEBY network', async function () { - await f.setProvider(NETWORKS.RINKEBY) - assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in POA network') - }) - - it('can not add inexistent token to MAINNET network', async function () { + it('can not add inexistent token to MAINNET', async function () { await f.setProvider(NETWORKS.MAINNET) - assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in POA network') + assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in Mainnet') + }) + + it('can not add inexistent token to ROPSTEN testnet', async function () { + await f.setProvider(NETWORKS.ROPSTEN) + assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in Ropsten testnet') + }) + + it('can not add inexistent token to KOVAN testnet', async function () { + await f.setProvider(NETWORKS.KOVAN) + assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in Kovan testnet') + }) + + it('can not add inexistent token to RINKEBY testnet', async function () { + await f.setProvider(NETWORKS.RINKEBY) + assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in Rinkeby testnet') + }) + + it('can not add inexistent token to RSK mainnet', async function () { + await f.setProvider(NETWORKS.RSK) + assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in RSK mainnet') + }) + + it('can not add inexistent token to RSK testnet', async function () { + await f.setProvider(NETWORKS.RSK_TESTNET) + assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in RSK testnet') }) it('can not add inexistent token to LOCALHOST network', async function () { @@ -1810,7 +1922,7 @@ describe('Metamask popup page', async function () { }) }) - describe('Remove token , provider is localhost', function () { + describe('Remove token, provider is localhost', function () { it('switch to account 1 ', async function () { const accountMenu = await f.waitUntilShowUp(menus.account.menu) @@ -2286,40 +2398,50 @@ describe('Metamask popup page', async function () { describe('Token should be displayed only for network, where it was added ', async function () { - it('token should not be displayed in POA network', async function () { + it('token should not be displayed in POA network', async function () { await f.setProvider(NETWORKS.POA) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - it('token should not be displayed in DAI network', async function () { + it('token should not be displayed in DAI network', async function () { await f.setProvider(NETWORKS.DAI) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - it('token should not be displayed in SOKOL network', async function () { + it('token should not be displayed in SOKOL testnet', async function () { await f.setProvider(NETWORKS.SOKOL) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - it('token should not be displayed in LOCALHOST network', async function () { - await f.setProvider(NETWORKS.LOCALHOST) - assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') - }) - - it('token should not be displayed in ROPSTEN network', async function () { + it('token should not be displayed in ROPSTEN testnet', async function () { await f.setProvider(NETWORKS.ROPSTEN) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - it('token should not be displayed in KOVAN network', async function () { + it('token should not be displayed in KOVAN testnet', async function () { await f.setProvider(NETWORKS.KOVAN) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - it('token should not be displayed in RINKEBY network', async function () { + it('token should not be displayed in RINKEBY testnet', async function () { await f.setProvider(NETWORKS.RINKEBY) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) + + it('token should not be displayed in RSK mainnet', async function () { + await f.setProvider(NETWORKS.RSK) + assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') + }) + + it('token should not be displayed in RSK testnet', async function () { + await f.setProvider(NETWORKS.RSK_TESTNET) + assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') + }) + + it('token should not be displayed in LOCALHOST network', async function () { + await f.setProvider(NETWORKS.LOCALHOST) + assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') + }) }) describe('remove Mainnet\'s tokens', function () { From afc0599c5acfeb272bf85fa4c07c65de55a2ad73 Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Fri, 11 Jan 2019 18:03:32 +0300 Subject: [PATCH 6/8] Expand utils unit tests to old_ui folder --- old-ui/app/util.js | 3 + test/unit/old-ui/app/util.spec.js | 256 ++++++++++++++++++++++++++++++ test/unit/util_test.js | 2 + 3 files changed, 261 insertions(+) diff --git a/old-ui/app/util.js b/old-ui/app/util.js index cb031ec2d..31a5cf2be 100644 --- a/old-ui/app/util.js +++ b/old-ui/app/util.js @@ -209,6 +209,9 @@ function normalizeEthStringToWei (str) { while (decimal.length < 18) { decimal += '0' } + if (decimal.length > 18) { + decimal = decimal.slice(0, 18) + } const decimalBN = new ethUtil.BN(decimal, 10) eth = eth.add(decimalBN) } diff --git a/test/unit/old-ui/app/util.spec.js b/test/unit/old-ui/app/util.spec.js index 556465598..2bf9d833a 100644 --- a/test/unit/old-ui/app/util.spec.js +++ b/test/unit/old-ui/app/util.spec.js @@ -4,7 +4,19 @@ const { getCurrentKeyring, ifLooseAcc, ifContractAcc, + addressSummary, + isValidAddress, + numericBalance, + parseBalance, + formatBalance, + normalizeToWei, + normalizeEthStringToWei, + normalizeNumberToWei, + isHex, } = require('../../../../old-ui/app/util') +const ethUtil = require('ethereumjs-util') +let ethInWei = '1' +for (let i = 0; i < 18; i++) { ethInWei += '0' } describe('countSignificantDecimals(val, len) function', () => { it('returns correct significant decimals', () => { @@ -74,3 +86,247 @@ describe('ifContractAcc(keyring) function', () => { assert.equal(false, ifContractAcc({})) }) }) + +describe('#addressSummary', function () { + it('should add case-sensitive checksum', function () { + const address = '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825' + const result = addressSummary(address) + assert.equal(result, '0xFDEa65C8...b825') + }) + + it('should accept arguments for firstseg, lastseg, and keepPrefix', function () { + const address = '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825' + const result = addressSummary(address, 4, 4, false) + assert.equal(result, 'FDEa...b825') + }) +}) + +describe('#isValidAddress', function () { + it('should allow 40-char non-prefixed hex', function () { + const address = 'fdea65c8e26263f6d9a1b5de9555d2931a33b825' + const result = isValidAddress(address) + assert.ok(result) + }) + + it('should allow 42-char non-prefixed hex', function () { + const address = '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825' + const result = isValidAddress(address) + assert.ok(result) + }) + + it('should not allow less non hex-prefixed', function () { + const address = 'fdea65c8e26263f6d9a1b5de9555d2931a33b85' + const result = isValidAddress(address) + assert.ok(!result) + }) + + it('should not allow less hex-prefixed', function () { + const address = '0xfdea65ce26263f6d9a1b5de9555d2931a33b85' + const result = isValidAddress(address) + assert.ok(!result) + }) + + it('should recognize correct capitalized checksum', function () { + const address = '0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825' + const result = isValidAddress(address) + assert.ok(result) + }) + + it('should recognize incorrect capitalized checksum', function () { + const address = '0xFDea65C8e26263F6d9A1B5de9555D2931A33b825' + const result = isValidAddress(address) + assert.ok(!result) + }) + + it('should recognize this sample hashed address', function () { + const address = '0x5Fda30Bb72B8Dfe20e48A00dFc108d0915BE9Bb0' + const result = isValidAddress(address) + const hashed = ethUtil.toChecksumAddress(address.toLowerCase()) + assert.equal(hashed, address, 'example is hashed correctly') + assert.ok(result, 'is valid by our check') + }) +}) + +describe('#numericBalance', function () { + it('should return a BN 0 if given nothing', function () { + const result = numericBalance() + assert.equal(result.toString(10), 0) + }) + + it('should work with hex prefix', function () { + const result = numericBalance('0x012') + assert.equal(result.toString(10), '18') + }) + + it('should work with no hex prefix', function () { + const result = numericBalance('012') + assert.equal(result.toString(10), '18') + }) +}) + +describe('#parseBalance', function () { + it('should render 0.01 eth correctly', function () { + const input = '0x2386F26FC10000' + const output = parseBalance(input) + assert.deepEqual(output, ['0', '01']) + }) + + it('should render 12.023 eth correctly', function () { + const input = 'A6DA46CCA6858000' + const output = parseBalance(input) + assert.deepEqual(output, ['12', '023']) + }) + + it('should render 0.0000000342422 eth correctly', function () { + const input = '0x7F8FE81C0' + const output = parseBalance(input) + assert.deepEqual(output, ['0', '0000000342422']) + }) + + it('should render 0 eth correctly', function () { + const input = '0x0' + const output = parseBalance(input) + assert.deepEqual(output, ['0', '0']) + }) +}) + +describe('formatBalance function', function () { + it('when given nothing', function () { + const result = formatBalance() + assert.equal(result, '0', 'should return "None"') + }) + + it('should return eth as string followed by ETH', function () { + const input = new ethUtil.BN(ethInWei, 10).toJSON() + console.log('input = ', input) + const result = formatBalance(input, 4) + assert.equal(result, '1.0000 ETH') + }) + + it('should return eth as string followed by ETH', function () { + const input = new ethUtil.BN(ethInWei, 10).div(new ethUtil.BN('2', 10)).toJSON() + console.log('input = ', input) + const result = formatBalance(input, 3) + assert.equal(result, '0.500 ETH') + }) + + it('should display specified decimal points', function () { + const input = '0x128dfa6a90b28000' + const result = formatBalance(input, 2) + assert.equal(result, '1.33 ETH') + }) + + it('should default to 3 decimal points', function () { + const input = '0x128dfa6a90b28000' + const result = formatBalance(input) + assert.equal(result, '1.337 ETH') + }) + + it('should show 2 significant digits for tiny balances', function () { + const input = '0x1230fa6a90b28' + const result = formatBalance(input) + assert.equal(result, '0.00032 ETH') + }) + + it('should not parse the balance and return value with 2 decimal points with ETH at the end', function () { + const value = '1.2456789' + const needsParse = false + const result = formatBalance(value, 2, needsParse) + assert.equal(result, '1.24 ETH') + }) +}) + +describe('normalizing values', function () { + describe('#normalizeToWei', function () { + it('should convert an eth to the appropriate equivalent values', function () { + var valueTable = { + wei: '1000000000000000000', + kwei: '1000000000000000', + mwei: '1000000000000', + gwei: '1000000000', + szabo: '1000000', + finney: '1000', + ether: '1', + // kether:'0.001', + // mether:'0.000001', + // AUDIT: We're getting BN numbers on these ones. + // I think they're big enough to ignore for now. + // gether:'0.000000001', + // tether:'0.000000000001', + } + var oneEthBn = new ethUtil.BN(ethInWei, 10) + + for (var currency in valueTable) { + var value = new ethUtil.BN(valueTable[currency], 10) + var output = normalizeToWei(value, currency) + assert.equal(output.toString(10), valueTable.wei, `value of ${output.toString(10)} ${currency} should convert to ${oneEthBn}`) + } + }) + }) + + describe('#normalizeEthStringToWei', function () { + it('should convert decimal eth to pure wei BN', function () { + var input = '1.23456789' + var output = normalizeEthStringToWei(input) + assert.equal(output.toString(10), '1234567890000000000') + }) + + it('should convert 1 to expected wei', function () { + var input = '1' + var output = normalizeEthStringToWei(input) + assert.equal(output.toString(10), ethInWei) + }) + + it('should account for overflow numbers gracefully by dropping extra precision.', function () { + var input = '1.11111111111111111111' + var output = normalizeEthStringToWei(input) + assert.equal(output.toString(10), '1111111111111111111') + }) + + it('should not truncate very exact wei values that do not have extra precision.', function () { + var input = '1.100000000000000001' + var output = normalizeEthStringToWei(input) + assert.equal(output.toString(10), '1100000000000000001') + }) + }) + + describe('#normalizeNumberToWei', function () { + it('should handle a simple use case', function () { + var input = 0.0002 + var output = normalizeNumberToWei(input, 'ether') + var str = output.toString(10) + assert.equal(str, '200000000000000') + }) + + it('should convert a kwei number to the appropriate equivalent wei', function () { + var result = normalizeNumberToWei(1.111, 'kwei') + assert.equal(result.toString(10), '1111', 'accepts decimals') + }) + + it('should convert a ether number to the appropriate equivalent wei', function () { + var result = normalizeNumberToWei(1.111, 'ether') + assert.equal(result.toString(10), '1111000000000000000', 'accepts decimals') + }) + }) + describe('#isHex', function () { + it('should return true when given a hex string', function () { + var result = isHex('c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2') + assert(result) + }) + + it('should return false when given a non-hex string', function () { + var result = isHex('c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714imnotreal') + assert(!result) + }) + + it('should return false when given a string containing a non letter/number character', function () { + var result = isHex('c3ab8ff13720!8ad9047dd39466b3c%8974e592c2fa383d4a396071imnotreal') + assert(!result) + }) + + it('should return true when given a hex string with hex-prefix', function () { + var result = isHex('0xc3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2') + assert(result) + }) + }) +}) diff --git a/test/unit/util_test.js b/test/unit/util_test.js index 39473854f..65bd19b52 100644 --- a/test/unit/util_test.js +++ b/test/unit/util_test.js @@ -128,12 +128,14 @@ describe('util', function () { it('should return eth as string followed by ETH', function () { var input = new ethUtil.BN(ethInWei, 10).toJSON() + console.log('input = ', input) var result = util.formatBalance(input, 4) assert.equal(result, '1.0000 ETH') }) it('should return eth as string followed by ETH', function () { var input = new ethUtil.BN(ethInWei, 10).div(new ethUtil.BN('2', 10)).toJSON() + console.log('input = ', input) var result = util.formatBalance(input, 3) assert.equal(result, '0.500 ETH') }) From dcaf8a8ea135f4bdaae1e31f42373ecf3d2d2cdb Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Tue, 29 Jan 2019 13:47:13 +0300 Subject: [PATCH 7/8] refactoring: enums for networks props --- app/scripts/controllers/currency.js | 5 +- app/scripts/controllers/network/enums.js | 16 ---- app/scripts/controllers/network/network.js | 12 +-- app/scripts/controllers/network/util.js | 28 ------ app/scripts/lib/buy-eth-url.js | 21 +---- old-ui/app/components/fiat-value.js | 4 +- .../app/components/transaction-list-item.js | 7 +- old-ui/app/conf-tx.js | 4 +- test/e2e/elements.js | 5 -- test/e2e/func.js | 12 +-- test/e2e/nw.spec.js | 5 -- test/e2e/test-cases/RSK-network-tests.js | 90 ------------------- test/e2e/test-cases/add-token-custom.spec.js | 20 ----- test/e2e/test-cases/add-token-search.spec.js | 10 --- ui/app/actions.js | 7 +- 15 files changed, 15 insertions(+), 231 deletions(-) delete mode 100644 test/e2e/test-cases/RSK-network-tests.js diff --git a/app/scripts/controllers/currency.js b/app/scripts/controllers/currency.js index 597fc06de..7ce6b31d7 100644 --- a/app/scripts/controllers/currency.js +++ b/app/scripts/controllers/currency.js @@ -130,10 +130,7 @@ class CurrencyController { currentCurrency = this.getCurrentCurrency() currentCoin = this.getCurrentCoin() let conversionRate, conversionDate - if (currentCoin === 'poa' || currentCoin === 'rbtc') { - if (currentCoin === 'rbtc') { - currentCoin = 'btc' - } + if (currentCoin === 'poa') { const apiLink = `https://min-api.cryptocompare.com/data/price?fsym=${currentCoin.toUpperCase()}&tsyms=${currentCurrency.toUpperCase()}` const response = await fetch(apiLink) const parsedResponse = await response.json() diff --git a/app/scripts/controllers/network/enums.js b/app/scripts/controllers/network/enums.js index e9a58ec68..661fd6ac0 100644 --- a/app/scripts/controllers/network/enums.js +++ b/app/scripts/controllers/network/enums.js @@ -5,8 +5,6 @@ const MAINNET = 'mainnet' const ROPSTEN = 'ropsten' const RINKEBY = 'rinkeby' const KOVAN = 'kovan' -const RSK = 'rsk' -const RSK_TESTNET = 'rsk_testnet' const LOCALHOST = 'localhost' const POA_CODE = 99 @@ -16,8 +14,6 @@ const MAINNET_CODE = 1 const ROPSTEN_CODE = 3 const RINKEBY_CODE = 4 const KOVAN_CODE = 42 -const RSK_CODE = 30 -const RSK_TESTNET_CODE = 31 const POA_DISPLAY_NAME = 'POA Network' const DAI_DISPLAY_NAME = 'xDai Chain' @@ -26,8 +22,6 @@ const MAINNET_DISPLAY_NAME = 'Main Ethereum Network' const ROPSTEN_DISPLAY_NAME = 'Ropsten' const RINKEBY_DISPLAY_NAME = 'Rinkeby' const KOVAN_DISPLAY_NAME = 'Kovan' -const RSK_DISPLAY_NAME = 'RSK Mainnet' -const RSK_TESTNET_DISPLAY_NAME = 'RSK Testnet' const DROPDOWN_POA_DISPLAY_NAME = POA_DISPLAY_NAME const DROPDOWN_DAI_DISPLAY_NAME = DAI_DISPLAY_NAME @@ -36,8 +30,6 @@ const DROPDOWN_MAINNET_DISPLAY_NAME = 'Main Network' const DROPDOWN_ROPSTEN_DISPLAY_NAME = 'Ropsten Test Net' const DROPDOWN_RINKEBY_DISPLAY_NAME = 'Rinkeby Test Net' const DROPDOWN_KOVAN_DISPLAY_NAME = 'Kovan Test Net' -const DROPDOWN_RSK_DISPLAY_NAME = 'RSK Main Net' -const DROPDOWN_RSK_TESTNET_DISPLAY_NAME = 'RSK Test Net' module.exports = { POA, @@ -47,8 +39,6 @@ module.exports = { ROPSTEN, RINKEBY, KOVAN, - RSK, - RSK_TESTNET, LOCALHOST, POA_CODE, DAI_CODE, @@ -57,8 +47,6 @@ module.exports = { ROPSTEN_CODE, RINKEBY_CODE, KOVAN_CODE, - RSK_CODE, - RSK_TESTNET_CODE, POA_DISPLAY_NAME, DAI_DISPLAY_NAME, POA_SOKOL_DISPLAY_NAME, @@ -66,8 +54,6 @@ module.exports = { ROPSTEN_DISPLAY_NAME, RINKEBY_DISPLAY_NAME, KOVAN_DISPLAY_NAME, - RSK_DISPLAY_NAME, - RSK_TESTNET_DISPLAY_NAME, DROPDOWN_POA_DISPLAY_NAME, DROPDOWN_DAI_DISPLAY_NAME, DROPDOWN_POA_SOKOL_DISPLAY_NAME, @@ -75,6 +61,4 @@ module.exports = { DROPDOWN_ROPSTEN_DISPLAY_NAME, DROPDOWN_RINKEBY_DISPLAY_NAME, DROPDOWN_KOVAN_DISPLAY_NAME, - DROPDOWN_RSK_DISPLAY_NAME, - DROPDOWN_RSK_TESTNET_DISPLAY_NAME, } diff --git a/app/scripts/controllers/network/network.js b/app/scripts/controllers/network/network.js index 3a1a0bd44..78a44adb6 100644 --- a/app/scripts/controllers/network/network.js +++ b/app/scripts/controllers/network/network.js @@ -22,13 +22,9 @@ const { POA_SOKOL, POA, DAI, - RSK, - RSK_TESTNET, POA_CODE, DAI_CODE, POA_SOKOL_CODE, - RSK_CODE, - RSK_TESTNET_CODE, } = require('./enums') const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET] @@ -118,9 +114,7 @@ module.exports = class NetworkController extends EventEmitter { type === LOCALHOST || type === POA_SOKOL || type === POA || - type === DAI || - type === RSK || - type === RSK_TESTNET + type === DAI , `NetworkController - Unknown rpc type "${type}"`) const providerConfig = { type } this.providerConfig = providerConfig @@ -162,10 +156,6 @@ module.exports = class NetworkController extends EventEmitter { this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(DAI_CODE)[0] }) } else if (type === POA_SOKOL) { this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_SOKOL_CODE)[0] }) - } else if (type === RSK) { - this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(RSK_CODE)[0] }) - } else if (type === RSK_TESTNET) { - this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(RSK_TESTNET_CODE)[0] }) } else if (type === LOCALHOST) { this._configureLocalhostProvider() // url-based rpc endpoints diff --git a/app/scripts/controllers/network/util.js b/app/scripts/controllers/network/util.js index 1a0059a17..820b6fd8e 100644 --- a/app/scripts/controllers/network/util.js +++ b/app/scripts/controllers/network/util.js @@ -6,8 +6,6 @@ const { ROPSTEN, RINKEBY, KOVAN, - RSK, - RSK_TESTNET, POA_CODE, DAI_CODE, POA_SOKOL_CODE, @@ -15,8 +13,6 @@ const { ROPSTEN_CODE, RINKEBY_CODE, KOVAN_CODE, - RSK_CODE, - RSK_TESTNET_CODE, POA_DISPLAY_NAME, DAI_DISPLAY_NAME, POA_SOKOL_DISPLAY_NAME, @@ -24,8 +20,6 @@ const { ROPSTEN_DISPLAY_NAME, RINKEBY_DISPLAY_NAME, KOVAN_DISPLAY_NAME, - RSK_DISPLAY_NAME, - RSK_TESTNET_DISPLAY_NAME, DROPDOWN_POA_DISPLAY_NAME, DROPDOWN_DAI_DISPLAY_NAME, DROPDOWN_POA_SOKOL_DISPLAY_NAME, @@ -33,8 +27,6 @@ const { DROPDOWN_ROPSTEN_DISPLAY_NAME, DROPDOWN_RINKEBY_DISPLAY_NAME, DROPDOWN_KOVAN_DISPLAY_NAME, - DROPDOWN_RSK_DISPLAY_NAME, - DROPDOWN_RSK_TESTNET_DISPLAY_NAME, } = require('./enums') const networks = {} @@ -109,26 +101,6 @@ const RINKEBY_OBJ = { networks[RINKEBY_CODE] = RINKEBY_OBJ networks[RINKEBY] = RINKEBY_OBJ -const RSK_OBJ = { - order: 8, - providerName: RSK, - networkID: RSK_CODE, - displayName: RSK_DISPLAY_NAME, - displayNameDropdown: DROPDOWN_RSK_DISPLAY_NAME, -} -networks[RSK_CODE] = RSK_OBJ -networks[RSK] = RSK_OBJ - -const RSK_TESTNET_OBJ = { - order: 9, - providerName: RSK_TESTNET, - networkID: RSK_TESTNET_CODE, - displayName: RSK_TESTNET_DISPLAY_NAME, - displayNameDropdown: DROPDOWN_RSK_TESTNET_DISPLAY_NAME, -} -networks[RSK_TESTNET_CODE] = RSK_TESTNET_OBJ -networks[RSK_TESTNET] = RSK_TESTNET_OBJ - const getNetworkDisplayName = key => networks[key].displayName module.exports = { diff --git a/app/scripts/lib/buy-eth-url.js b/app/scripts/lib/buy-eth-url.js index 37444e16d..9f68bb809 100644 --- a/app/scripts/lib/buy-eth-url.js +++ b/app/scripts/lib/buy-eth-url.js @@ -11,9 +11,7 @@ const { POA_CODE, MAINNET_CODE, ROPSTEN_CODE, RINKEBY_CODE, - KOVAN_CODE, - RSK_CODE, - RSK_TESTNET_CODE } = require('../controllers/network/enums') + KOVAN_CODE } = require('../controllers/network/enums') /** * Gives the caller a url at which the user can acquire coin, depending on the network they are in @@ -33,14 +31,12 @@ function getBuyEthUrl ({ network, amount, address, ind }) { case MAINNET_CODE: case POA_CODE: case DAI_CODE: - case RSK_CODE: url = getExchanges({network, amount, address})[ind].link break case ROPSTEN_CODE: case RINKEBY_CODE: case KOVAN_CODE: case POA_SOKOL_CODE: - case RSK_TESTNET_CODE: url = getFaucets(network)[ind] break } @@ -97,21 +93,6 @@ function getExchanges ({network, amount, address}) { link: 'https://dai-bridge.poa.network/', }, ] - case 30: - return [ - { - name: 'Huobi', - link: 'https://www.huobi.com/', - }, - { - name: 'Bitfinex', - link: 'https://www.bitfinex.com/', - }, - { - name: 'Bitso', - link: 'https://bitso.com/', - }, - ] default: return [] } diff --git a/old-ui/app/components/fiat-value.js b/old-ui/app/components/fiat-value.js index ee56e201b..3cd600ab8 100644 --- a/old-ui/app/components/fiat-value.js +++ b/old-ui/app/components/fiat-value.js @@ -1,14 +1,14 @@ import React, { Component } from 'react' import { formatBalance, countSignificantDecimals } from '../util' import PropTypes from 'prop-types' -import { DAI_CODE, POA_SOKOL_CODE, RSK_TESTNET_CODE } from '../../../app/scripts/controllers/network/enums' +import { DAI_CODE, POA_SOKOL_CODE } from '../../../app/scripts/controllers/network/enums' class FiatValue extends Component { render = () => { const props = this.props let { conversionRate } = props const { currentCurrency, network } = props - const isTestnet = parseInt(network) === POA_SOKOL_CODE || parseInt(network) === RSK_TESTNET_CODE + const isTestnet = parseInt(network) === POA_SOKOL_CODE const isDai = parseInt(network) === DAI_CODE if (isTestnet) { conversionRate = 0 diff --git a/old-ui/app/components/transaction-list-item.js b/old-ui/app/components/transaction-list-item.js index bd2227827..011dcb778 100644 --- a/old-ui/app/components/transaction-list-item.js +++ b/old-ui/app/components/transaction-list-item.js @@ -21,8 +21,8 @@ const { POA_CODE, MAINNET_CODE, ROPSTEN_CODE, RINKEBY_CODE, - KOVAN_CODE, - RSK_CODE } = require('../../../app/scripts/controllers/network/enums') + KOVAN_CODE +} = require('../../../app/scripts/controllers/network/enums') const mapDispatchToProps = dispatch => { return { @@ -80,8 +80,7 @@ TransactionListItem.prototype.render = function () { numericNet === KOVAN_CODE || numericNet === POA_SOKOL_CODE || numericNet === POA_CODE || - numericNet === DAI_CODE || - numericNet === RSK_CODE + numericNet === DAI_CODE var isMsg = ('msgParams' in transaction) var isTx = ('txParams' in transaction) diff --git a/old-ui/app/conf-tx.js b/old-ui/app/conf-tx.js index 32fdf9821..5824b6506 100644 --- a/old-ui/app/conf-tx.js +++ b/old-ui/app/conf-tx.js @@ -13,7 +13,7 @@ import PendingMsg from './components/pending-msg' import PendingPersonalMsg from './components/pending-personal-msg' import PendingTypedMsg from './components/pending-typed-msg' const Loading = require('./components/loading') -const { DAI_CODE, POA_SOKOL_CODE, RSK_TESTNET_CODE } = require('../../app/scripts/controllers/network/enums') +const { DAI_CODE, POA_SOKOL_CODE } = require('../../app/scripts/controllers/network/enums') const { getMetaMaskAccounts } = require('../../ui/app/selectors') module.exports = connect(mapStateToProps)(ConfirmTxScreen) @@ -57,7 +57,7 @@ ConfirmTxScreen.prototype.render = function () { unapprovedMsgs, unapprovedPersonalMsgs, unapprovedTypedMessages, blockGasLimit } = props let { conversionRate } = props - const isTestnet = parseInt(network) === POA_SOKOL_CODE || parseInt(network) === RSK_TESTNET_CODE + const isTestnet = parseInt(network) === POA_SOKOL_CODE const isDai = parseInt(network) === DAI_CODE if (isTestnet) { conversionRate = 0 diff --git a/test/e2e/elements.js b/test/e2e/elements.js index e157b7240..f7cf4da2d 100644 --- a/test/e2e/elements.js +++ b/test/e2e/elements.js @@ -295,8 +295,6 @@ module.exports = { buttons: { send: By.css('#app-content > div > div.app-primary.from-right > div > div > div.flex-row > button:nth-child(4)'), buy: By.css('#app-content > div > div.app-primary.from-right > div > div > div.flex-row > button:nth-child(3)'), - sendRSK: By.css('#app-content > div > div.app-primary.from-left > div > div > div.flex-row > button:nth-child(4)'), - buyRSK: By.css('#app-content > div > div.app-primary.from-left > div > div > div.flex-row > button:nth-child(3)'), sendText: 'Send', save: By.className('editable-button'), }, @@ -325,7 +323,6 @@ module.exports = { }, buyEther: { title: By.className('flex-center buy-title'), - faucetLinkRSK: By.className('buy-option cursor-pointer'), buttonArrow: By.className('fa fa-arrow-left fa-lg cursor-pointer'), }, info: { @@ -401,8 +398,6 @@ module.exports = { ROPSTEN: 'ropsten', KOVAN: 'kovan', RINKEBY: 'rinkeby', - RSK: 'rsk', - RSK_TESTNET: 'rsk_testnet', LOCALHOST: 'localhost', CUSTOM: 'http://test.com', }, diff --git a/test/e2e/func.js b/test/e2e/func.js index 117630456..804123db8 100644 --- a/test/e2e/func.js +++ b/test/e2e/func.js @@ -132,20 +132,14 @@ class Functions { case NETWORKS.RINKEBY: counter = 6 break - case NETWORKS.RSK: + case NETWORKS.LOCALHOST: counter = 7 break - case NETWORKS.RSK_TESTNET: + case NETWORKS.CUSTOM: counter = 8 break - case NETWORKS.LOCALHOST: - counter = 9 - break - case NETWORKS.CUSTOM: - counter = 10 - break default: - counter = 9 + counter = 7 } await this.driver.executeScript("document.getElementsByClassName('dropdown-menu-item')[" + counter + '].click();') } diff --git a/test/e2e/nw.spec.js b/test/e2e/nw.spec.js index 67d55cf78..afd5d1028 100644 --- a/test/e2e/nw.spec.js +++ b/test/e2e/nw.spec.js @@ -13,7 +13,6 @@ const deleteImportedAccount = require(`${testsFolder}/delete-imported-account.sp 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`) @@ -116,10 +115,6 @@ describe('Metamask popup page', async function () { await importGanacheSeedPhrase(f, account2, password) }) - describe('RSK network tests', async () => { - await RSKNetworkTests(f, account1) - }) - describe('Check the filter of emitted events', async () => { await checkEmittedEvents(f, account1, account2) }) diff --git a/test/e2e/test-cases/RSK-network-tests.js b/test/e2e/test-cases/RSK-network-tests.js deleted file mode 100644 index 50a172d49..000000000 --- a/test/e2e/test-cases/RSK-network-tests.js +++ /dev/null @@ -1,90 +0,0 @@ -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 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('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('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('31500') - 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') - }) -} - -module.exports = RSKNetworkTests diff --git a/test/e2e/test-cases/add-token-custom.spec.js b/test/e2e/test-cases/add-token-custom.spec.js index c88e63bfb..15f3d4a86 100644 --- a/test/e2e/test-cases/add-token-custom.spec.js +++ b/test/e2e/test-cases/add-token-custom.spec.js @@ -165,16 +165,6 @@ const addCustomToken = async (f, account1, account2) => { await f.setProvider(NETWORKS.RINKEBY) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - - it('token should not be displayed in RSK network', async () => { - await f.setProvider(NETWORKS.RSK) - assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') - }) - - it('token should not be displayed in RSK testnet', async () => { - await f.setProvider(NETWORKS.RSK_TESTNET) - assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') - }) }) describe.skip('Custom tokens validation ', async () => { @@ -210,16 +200,6 @@ const addCustomToken = async (f, account1, account2) => { assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in MAINNET') }) - it('can not add inexistent token to RSK mainnet', async () => { - await f.setProvider(NETWORKS.RSK) - assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in RSK mainnet') - }) - - it('can not add inexistent token to RSK testnet', async () => { - await f.setProvider(NETWORKS.RSK_TESTNET) - assert(await f.isDisabledAddInexistentToken(tokenAddress), true, 'can add inexistent token in RSK testnet') - }) - it('can not add inexistent token to LOCALHOST network', async () => { await f.setProvider(NETWORKS.LOCALHOST) assert(await f.isDisabledAddInexistentToken(tokenAddress.slice(0, tokenAddress.length - 2) + '0'), true, 'can add inexistent token in LOCALHOST network') diff --git a/test/e2e/test-cases/add-token-search.spec.js b/test/e2e/test-cases/add-token-search.spec.js index 2e6a3497a..fbb324ede 100644 --- a/test/e2e/test-cases/add-token-search.spec.js +++ b/test/e2e/test-cases/add-token-search.spec.js @@ -250,16 +250,6 @@ const addTokeFromSearch = async (f) => { await f.setProvider(NETWORKS.RINKEBY) assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') }) - - it('token should not be displayed in RSK mainnet', async () => { - await f.setProvider(NETWORKS.RSK) - assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') - }) - - it('token should not be displayed in RSK testnet', async () => { - await f.setProvider(NETWORKS.RSK_TESTNET) - assert.equal(await f.assertTokensNotDisplayed(), true, 'tokens are displayed') - }) }) describe('remove Mainnet\'s tokens', function () { diff --git a/ui/app/actions.js b/ui/app/actions.js index e479e6062..ac89d827e 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -13,9 +13,7 @@ const log = require('loglevel') const { ENVIRONMENT_TYPE_NOTIFICATION } = require('../../app/scripts/lib/enums') const { POA, DAI, - POA_SOKOL, - RSK, - RSK_TESTNET } = require('../../app/scripts/controllers/network/enums') + POA_SOKOL } = require('../../app/scripts/controllers/network/enums') const { hasUnconfirmedTransactions } = require('./helpers/confirm-transaction/util') const WebcamUtils = require('../lib/webcam-utils') @@ -2005,8 +2003,7 @@ function setProviderType (type) { const newCoin = type === POA || type === POA_SOKOL ? 'poa' : type === DAI ? - 'dai' : type === RSK || type === RSK_TESTNET ? - 'rbtc' : 'eth' + 'dai' : 'eth' background.setCurrentCoin(newCoin, (err, data) => { if (err) { log.error(err.stack) From 4b45354daa0688c8bd8c2b56b81181ac6965f12e Mon Sep 17 00:00:00 2001 From: Victor Baranov Date: Tue, 29 Jan 2019 13:48:07 +0300 Subject: [PATCH 8/8] ESLinter fix --- old-ui/app/components/transaction-list-item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/old-ui/app/components/transaction-list-item.js b/old-ui/app/components/transaction-list-item.js index 011dcb778..64d460150 100644 --- a/old-ui/app/components/transaction-list-item.js +++ b/old-ui/app/components/transaction-list-item.js @@ -21,7 +21,7 @@ const { POA_CODE, MAINNET_CODE, ROPSTEN_CODE, RINKEBY_CODE, - KOVAN_CODE + KOVAN_CODE, } = require('../../../app/scripts/controllers/network/enums') const mapDispatchToProps = dispatch => {