diff --git a/src/components/App/index.tsx b/src/components/App/index.tsx
index ee90992af8..eda52cb2ee 100644
--- a/src/components/App/index.tsx
+++ b/src/components/App/index.tsx
@@ -16,8 +16,8 @@ import CookiesBanner from 'src/components/CookiesBanner'
import Notifier from 'src/components/Notifier'
import Backdrop from 'src/components/layout/Backdrop'
import Img from 'src/components/layout/Img'
-import { getNetwork } from 'src/config'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { getNetworkId } from 'src/config'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import { networkSelector } from 'src/logic/wallets/store/selectors'
import { SAFELIST_ADDRESS, WELCOME_ADDRESS } from 'src/routes/routes'
import { safeNameSelector, safeParamAddressFromStateSelector } from 'src/logic/safe/store/selectors'
@@ -26,7 +26,7 @@ import SendModal from 'src/routes/safe/components/Balances/SendModal'
import { useLoadSafe } from 'src/logic/safe/hooks/useLoadSafe'
import { useSafeScheduledUpdates } from 'src/logic/safe/hooks/useSafeScheduledUpdates'
import useSafeActions from 'src/logic/safe/hooks/useSafeActions'
-import { currentCurrencySelector, safeFiatBalancesTotalSelector } from 'src/logic/currencyValues/store/selectors/index'
+import { currentCurrencySelector, safeFiatBalancesTotalSelector } from 'src/logic/currencyValues/store/selectors'
import { formatAmountInUsFormat } from 'src/logic/tokens/utils/formatAmount'
import { grantedSelector } from 'src/routes/safe/container/selector'
@@ -55,7 +55,7 @@ const Frame = styled.div`
max-width: 100%;
`
-const desiredNetwork = getNetwork()
+const desiredNetwork = getNetworkId()
const useStyles = makeStyles(notificationStyles)
diff --git a/src/components/AppLayout/Header/components/NetworkLabel.tsx b/src/components/AppLayout/Header/components/NetworkLabel.tsx
index 2ff24a5a73..d68da3fb65 100644
--- a/src/components/AppLayout/Header/components/NetworkLabel.tsx
+++ b/src/components/AppLayout/Header/components/NetworkLabel.tsx
@@ -3,11 +3,11 @@ import * as React from 'react'
import Col from 'src/components/layout/Col'
import Paragraph from 'src/components/layout/Paragraph'
-import { getNetwork } from 'src/config'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { getNetworkId } from 'src/config'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import { border, md, screenSm, sm, xs } from 'src/theme/variables'
-const interfaceNetwork = getNetwork()
+const interfaceNetwork = getNetworkId()
const formatNetwork = (network: number): string =>
ETHEREUM_NETWORK[network][0].toUpperCase() + ETHEREUM_NETWORK[network].substring(1).toLowerCase()
diff --git a/src/components/AppLayout/Header/components/ProviderDetails/UserDetails.tsx b/src/components/AppLayout/Header/components/ProviderDetails/UserDetails.tsx
index f651eeef50..8540335b64 100644
--- a/src/components/AppLayout/Header/components/ProviderDetails/UserDetails.tsx
+++ b/src/components/AppLayout/Header/components/ProviderDetails/UserDetails.tsx
@@ -14,7 +14,7 @@ import Paragraph from 'src/components/layout/Paragraph'
import Row from 'src/components/layout/Row'
import { background, connected as connectedBg, lg, md, sm, warning, xs } from 'src/theme/variables'
import { upperFirst } from 'src/utils/css'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
const dot = require('../../assets/dotRinkeby.svg')
const walletIcon = require('../../assets/wallet.svg')
diff --git a/src/components/AppLayout/Header/components/ProviderInfo/ProviderAccessible.tsx b/src/components/AppLayout/Header/components/ProviderInfo/ProviderAccessible.tsx
index 8253833781..0ae85a2a15 100644
--- a/src/components/AppLayout/Header/components/ProviderInfo/ProviderAccessible.tsx
+++ b/src/components/AppLayout/Header/components/ProviderInfo/ProviderAccessible.tsx
@@ -1,8 +1,8 @@
import { makeStyles } from '@material-ui/core/styles'
import * as React from 'react'
import { EthHashInfo, Text } from '@gnosis.pm/safe-react-components'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import NetworkLabel from '../NetworkLabel'
import CircleDot from 'src/components/AppLayout/Header/components/CircleDot'
import Col from 'src/components/layout/Col'
diff --git a/src/components/AppLayout/Sidebar/SafeHeader/index.tsx b/src/components/AppLayout/Sidebar/SafeHeader/index.tsx
index 273a1476b2..f00c03adaf 100644
--- a/src/components/AppLayout/Sidebar/SafeHeader/index.tsx
+++ b/src/components/AppLayout/Sidebar/SafeHeader/index.tsx
@@ -1,5 +1,4 @@
import React from 'react'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
import styled from 'styled-components'
import {
Icon,
@@ -12,7 +11,7 @@ import {
EtherscanButton,
} from '@gnosis.pm/safe-react-components'
-import { getNetwork } from 'src/config'
+import { getNetworkName } from 'src/config'
import FlexSpacer from 'src/components/FlexSpacer'
export const TOGGLE_SIDEBAR_BTN_TESTID = 'TOGGLE_SIDEBAR_BTN'
@@ -129,7 +128,7 @@ const SafeHeader = ({
-
+
{granted ? null : (
diff --git a/src/components/ConnectButton/index.tsx b/src/components/ConnectButton/index.tsx
index db81d05ce9..a719776f04 100644
--- a/src/components/ConnectButton/index.tsx
+++ b/src/components/ConnectButton/index.tsx
@@ -2,7 +2,7 @@ import Onboard from 'bnc-onboard'
import React from 'react'
import Button from 'src/components/layout/Button'
-import { getNetwork } from 'src/config'
+import { getNetworkId } from 'src/config'
import { getWeb3, setWeb3 } from 'src/logic/wallets/getWeb3'
import { fetchProvider } from 'src/logic/wallets/store/actions'
import transactionDataCheck from 'src/logic/wallets/transactionDataCheck'
@@ -20,7 +20,7 @@ const wallets = getSupportedWallets()
export const onboard = Onboard({
dappId: BLOCKNATIVE_API_KEY,
- networkId: getNetwork(),
+ networkId: getNetworkId(),
subscriptions: {
wallet: (wallet) => {
if (wallet.provider) {
diff --git a/src/components/SafeListSidebar/SafeList/index.tsx b/src/components/SafeListSidebar/SafeList/index.tsx
index f0875334de..f2327a8698 100644
--- a/src/components/SafeListSidebar/SafeList/index.tsx
+++ b/src/components/SafeListSidebar/SafeList/index.tsx
@@ -3,13 +3,12 @@ import ListItem from '@material-ui/core/ListItem'
import { makeStyles } from '@material-ui/core/styles'
import { EthHashInfo, Icon, Text, ButtonLink } from '@gnosis.pm/safe-react-components'
import * as React from 'react'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
import styled from 'styled-components'
import { SafeRecord } from 'src/logic/safe/store/models/safe'
import { DefaultSafe } from 'src/routes/safe/store/reducer/types/safe'
import { SetDefaultSafe } from 'src/logic/safe/store/actions/setDefaultSafe'
-import { getNetwork } from 'src/config'
+import { getNetworkName } from 'src/config'
import DefaultBadge from './DefaultBadge'
import Hairline from 'src/components/layout/Hairline'
import Link from 'src/components/layout/Link'
@@ -115,7 +114,7 @@ const SafeList = ({ currentSafe, defaultSafe, onSafeClick, safes, setDefaultSafe
name={safe.name}
showIdenticon
shortenHash={4}
- network={ETHEREUM_NETWORK[getNetwork()]}
+ network={getNetworkName()}
/>
diff --git a/src/config/__tests__/config.test.ts b/src/config/__tests__/config.test.ts
new file mode 100644
index 0000000000..021a4a20e7
--- /dev/null
+++ b/src/config/__tests__/config.test.ts
@@ -0,0 +1,136 @@
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
+import { default as networks } from 'src/config/networks'
+
+const { mainnet, xdai } = networks
+
+describe('Config Services', () => {
+ beforeEach(() => {
+ jest.resetModules()
+ })
+
+ it(`should load 'test' network config`, () => {
+ // Given
+ jest.mock('src/utils/constants', () => ({
+ NODE_ENV: 'test',
+ }))
+ const { getNetworkInfo } = require('src/config')
+
+ // When
+ const networkInfo = getNetworkInfo()
+
+ // Then
+ expect(networkInfo.id).toBe(ETHEREUM_NETWORK.LOCAL)
+ })
+
+ it(`should load 'mainnet' network config`, () => {
+ // Given
+ jest.mock('src/utils/constants', () => ({
+ NODE_ENV: '',
+ NETWORK: 'MAINNET',
+ }))
+ const { getNetworkInfo } = require('src/config')
+
+ // When
+ const networkInfo = getNetworkInfo()
+
+ // Then
+ expect(networkInfo.id).toBe(ETHEREUM_NETWORK.MAINNET)
+ })
+
+ it(`should load 'mainnet.dev' network config`, () => {
+ // Given
+ jest.mock('src/utils/constants', () => ({
+ NODE_ENV: '',
+ NETWORK: 'MAINNET',
+ }))
+ const { getTxServiceUrl, getGnosisSafeAppsUrl } = require('src/config')
+ const TX_SERVICE_URL = mainnet.environment.dev?.txServiceUrl
+ const SAFE_APPS_URL = mainnet.environment.dev?.safeAppsUrl
+
+ // When
+ const txServiceUrl = getTxServiceUrl()
+ const safeAppsUrl = getGnosisSafeAppsUrl()
+
+ // Then
+ expect(TX_SERVICE_URL).toBe(txServiceUrl)
+ expect(SAFE_APPS_URL).toBe(safeAppsUrl)
+ })
+
+ it(`should load 'mainnet.staging' network config`, () => {
+ // Given
+ jest.mock('src/utils/constants', () => ({
+ NODE_ENV: 'production',
+ NETWORK: 'MAINNET',
+ }))
+ const { getTxServiceUrl, getGnosisSafeAppsUrl } = require('src/config')
+ const TX_SERVICE_URL = mainnet.environment.staging?.txServiceUrl
+ const SAFE_APPS_URL = mainnet.environment.staging?.safeAppsUrl
+
+ // When
+ const txServiceUrl = getTxServiceUrl()
+ const safeAppsUrl = getGnosisSafeAppsUrl()
+
+ // Then
+ expect(TX_SERVICE_URL).toBe(txServiceUrl)
+ expect(SAFE_APPS_URL).toBe(safeAppsUrl)
+ })
+
+ it(`should load 'mainnet.production' network config`, () => {
+ // Given
+ jest.mock('src/utils/constants', () => ({
+ NODE_ENV: 'production',
+ NETWORK: 'MAINNET',
+ APP_ENV: 'production'
+ }))
+ const { getTxServiceUrl, getGnosisSafeAppsUrl } = require('src/config')
+ const TX_SERVICE_URL = mainnet.environment.production.txServiceUrl
+ const SAFE_APPS_URL = mainnet.environment.production.safeAppsUrl
+
+ // When
+ const txServiceUrl = getTxServiceUrl()
+ const safeAppsUrl = getGnosisSafeAppsUrl()
+
+ // Then
+ expect(TX_SERVICE_URL).toBe(txServiceUrl)
+ expect(SAFE_APPS_URL).toBe(safeAppsUrl)
+ })
+
+ it(`should load 'xdai.production' network config`, () => {
+ // Given
+ jest.mock('src/utils/constants', () => ({
+ NODE_ENV: 'production',
+ NETWORK: 'XDAI',
+ APP_ENV: 'production'
+ }))
+ const { getTxServiceUrl, getGnosisSafeAppsUrl } = require('src/config')
+ const TX_SERVICE_URL = xdai.environment.production.txServiceUrl
+ const SAFE_APPS_URL = xdai.environment.production.safeAppsUrl
+
+ // When
+ const txServiceUrl = getTxServiceUrl()
+ const safeAppsUrl = getGnosisSafeAppsUrl()
+
+ // Then
+ expect(TX_SERVICE_URL).toBe(txServiceUrl)
+ expect(SAFE_APPS_URL).toBe(safeAppsUrl)
+ })
+
+ it(`should default to 'xdai.production' network config if no environment is found`, () => {
+ // Given
+ jest.mock('src/utils/constants', () => ({
+ NODE_ENV: '',
+ NETWORK: 'XDAI',
+ }))
+ const { getTxServiceUrl, getGnosisSafeAppsUrl } = require('src/config')
+ const TX_SERVICE_URL = xdai.environment.production.txServiceUrl
+ const SAFE_APPS_URL = xdai.environment.production.safeAppsUrl
+
+ // When
+ const txServiceUrl = getTxServiceUrl()
+ const safeAppsUrl = getGnosisSafeAppsUrl()
+
+ // Then
+ expect(TX_SERVICE_URL).toBe(txServiceUrl)
+ expect(SAFE_APPS_URL).toBe(safeAppsUrl)
+ })
+})
diff --git a/src/config/development-mainnet.ts b/src/config/development-mainnet.ts
deleted file mode 100644
index a26a7075ae..0000000000
--- a/src/config/development-mainnet.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-import devConfig from './development'
-import { TX_SERVICE_HOST, RELAY_API_URL } from 'src/config/names'
-
-const devMainnetConfig = {
- ...devConfig,
- [TX_SERVICE_HOST]: 'https://safe-transaction.mainnet.staging.gnosisdev.com/api/v1/',
- [RELAY_API_URL]: 'https://safe-relay.mainnet.staging.gnosisdev.com/api/v1/',
-}
-
-export default devMainnetConfig
diff --git a/src/config/development.ts b/src/config/development.ts
deleted file mode 100644
index fa26777e48..0000000000
--- a/src/config/development.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { TX_SERVICE_HOST, SIGNATURES_VIA_METAMASK, RELAY_API_URL, SAFE_APPS_URL } from 'src/config/names'
-
-const devConfig = {
- [TX_SERVICE_HOST]: 'https://safe-transaction.staging.gnosisdev.com/api/v1/',
- [SIGNATURES_VIA_METAMASK]: false,
- [RELAY_API_URL]: 'https://safe-relay.staging.gnosisdev.com/api/v1/',
- [SAFE_APPS_URL]: 'https://safe-apps.dev.gnosisdev.com/'
- //[SAFE_APPS_URL]: 'http://localhost:3002/'
-}
-
-export default devConfig
diff --git a/src/config/index.ts b/src/config/index.ts
index b6847acd91..ec5c367d34 100644
--- a/src/config/index.ts
+++ b/src/config/index.ts
@@ -1,96 +1,95 @@
-import { checksumAddress } from 'src/utils/checksumAddress';
-import { ensureOnce } from 'src/utils/singleton'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import networks from 'src/config/networks'
import {
- RELAY_API_URL,
- SIGNATURES_VIA_METAMASK,
- TX_SERVICE_HOST,
- SAFE_APPS_URL
-} from 'src/config/names'
-import devConfig from './development'
-import testConfig from './testing'
-import stagingConfig from './staging'
-import prodConfig from './production'
-import mainnetDevConfig from './development-mainnet'
-import mainnetProdConfig from './production-mainnet'
-import mainnetStagingConfig from './staging-mainnet'
-import { NETWORK } from 'src/utils/constants'
-
-const configuration = () => {
- if (process.env.NODE_ENV === 'test') {
- return testConfig
- }
+ EnvironmentSettings,
+ ETHEREUM_NETWORK,
+ NetworkSettings,
+ SafeFeatures,
+} from 'src/config/networks/network.d'
+import { checksumAddress } from 'src/utils/checksumAddress'
+import { GOOGLE_ANALYTICS_ID, NETWORK, APP_ENV, NODE_ENV } from 'src/utils/constants'
+import { ensureOnce } from 'src/utils/singleton'
- if (process.env.NODE_ENV === 'production') {
- if (process.env.REACT_APP_NETWORK === 'mainnet') {
- return process.env.REACT_APP_ENV === 'production'
- ? mainnetProdConfig
- : mainnetStagingConfig
- }
+export const getNetworkId = (): ETHEREUM_NETWORK => ETHEREUM_NETWORK[NETWORK]
- return process.env.REACT_APP_ENV === 'production'
- ? prodConfig
- : stagingConfig
+export const getNetworkName = (): string => ETHEREUM_NETWORK[getNetworkId()]
+
+const getCurrentEnvironment = (): string => {
+ switch (NODE_ENV) {
+ case 'test': {
+ return 'test'
+ }
+ case 'production': {
+ return APP_ENV === 'production' ? 'production' : 'staging'
+ }
+ default: {
+ return 'dev'
+ }
}
+}
- return process.env.REACT_APP_NETWORK === 'mainnet'
- ? mainnetDevConfig
- : devConfig
+type NetworkSpecificConfiguration = EnvironmentSettings & {
+ network: NetworkSettings,
+ features?: SafeFeatures,
}
-export const getNetwork = (): ETHEREUM_NETWORK => ETHEREUM_NETWORK[NETWORK] ?? ETHEREUM_NETWORK.RINKEBY
+const configuration = (): NetworkSpecificConfiguration => {
+ const currentEnvironment = getCurrentEnvironment()
-const getConfig = ensureOnce(configuration)
+ // special case for test environment
+ if (currentEnvironment === 'test') {
+ const configFile = networks.local
-export const getTxServiceHost = () => {
- const config = getConfig()
+ return {
+ ...configFile.environment.production,
+ network: configFile.network,
+ features: configFile.features,
+ }
+ }
- return config[TX_SERVICE_HOST]
-}
+ // lookup the config file based on the network specified in the NETWORK variable
+ const configFile = networks[getNetworkName().toLowerCase()]
+ // defaults to 'production' as it's the only environment that is required for the network configs
+ const networkBaseConfig = configFile.environment[currentEnvironment] ?? configFile.environment.production
-export const getTxServiceUriFrom = (safeAddress) =>
- `safes/${safeAddress}/transactions/`
+ return {
+ ...networkBaseConfig,
+ network: configFile.network,
+ features: configFile.features,
+ }
+}
-export const getIncomingTxServiceUriTo = (safeAddress) =>
- `safes/${safeAddress}/incoming-transfers/`
+const getConfig: () => NetworkSpecificConfiguration = ensureOnce(configuration)
-export const getAllTransactionsUriFrom = (safeAddress: string): string =>
- `safes/${safeAddress}/all-transactions/`
+export const getTxServiceUrl = (): string => getConfig()?.txServiceUrl
-export const getSafeCreationTxUri = (safeAddress) => `safes/${safeAddress}/creation/`
+export const getRelayUrl = (): string | undefined => getConfig()?.relayApiUrl
-export const getRelayUrl = () => getConfig()[RELAY_API_URL]
+export const getGnosisSafeAppsUrl = (): string => getConfig()?.safeAppsUrl
-export const signaturesViaMetamask = () => {
- const config = getConfig()
+export const getRpcServiceUrl = (): string => getConfig()?.rpcServiceUrl
- return config[SIGNATURES_VIA_METAMASK]
-}
+export const getNetworkExplorerInfo = (): { name: string; url: string; apiUrl: string } => ({
+ name: getConfig()?.networkExplorerName,
+ url: getConfig()?.networkExplorerUrl,
+ apiUrl: getConfig()?.networkExplorerApiUrl,
+})
-export const getGnosisSafeAppsUrl = () => {
- const config = getConfig()
+export const getNetworkConfigFeatures = (): SafeFeatures | undefined => getConfig()?.features
- return config[SAFE_APPS_URL]
-}
+export const getNetworkInfo = (): NetworkSettings => getConfig()?.network
-export const getGoogleAnalyticsTrackingID = () =>
- getNetwork() === ETHEREUM_NETWORK.MAINNET
- ? process.env.REACT_APP_GOOGLE_ANALYTICS_ID_MAINNET
- : process.env.REACT_APP_GOOGLE_ANALYTICS_ID_RINKEBY
+export const getTxServiceUriFrom = (safeAddress: string) => `safes/${safeAddress}/transactions/`
-export const getIntercomId = () =>
- process.env.REACT_APP_ENV === 'production'
- ? process.env.REACT_APP_INTERCOM_ID
- : 'plssl1fl'
+export const getIncomingTxServiceUriTo = (safeAddress: string) => `safes/${safeAddress}/incoming-transfers/`
-export const getExchangeRatesUrl = () => 'https://api.exchangeratesapi.io/latest'
+export const getAllTransactionsUriFrom = (safeAddress: string) => `safes/${safeAddress}/all-transactions/`
-export const getExchangeRatesUrlFallback = () => 'https://api.coinbase.com/v2/exchange-rates'
+export const getSafeCreationTxUri = (safeAddress: string) => `safes/${safeAddress}/creation/`
-export const getSafeLastVersion = () => process.env.REACT_APP_LATEST_SAFE_VERSION || '1.1.1'
+export const getGoogleAnalyticsTrackingID = (): string => GOOGLE_ANALYTICS_ID[getNetworkName()]
-export const buildSafeCreationTxUrl = (safeAddress) => {
- const host = getTxServiceHost()
+export const buildSafeCreationTxUrl = (safeAddress: string) => {
+ const host = getTxServiceUrl()
const address = checksumAddress(safeAddress)
const base = getSafeCreationTxUri(address)
diff --git a/src/config/names.ts b/src/config/names.ts
deleted file mode 100644
index 3390fbecb8..0000000000
--- a/src/config/names.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export const TX_SERVICE_HOST = 'tsh'
-export const SIGNATURES_VIA_METAMASK = 'svm'
-export const RELAY_API_URL = 'rau'
-export const SAFE_APPS_URL = 'sau'
diff --git a/src/config/networks/__tests__/networks.test.ts b/src/config/networks/__tests__/networks.test.ts
index bb29462d0c..c49514bf8e 100644
--- a/src/config/networks/__tests__/networks.test.ts
+++ b/src/config/networks/__tests__/networks.test.ts
@@ -1,25 +1,39 @@
import fs from 'fs'
-import { NetworkConfig } from 'src/config/networks/network.d'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import networks from 'src/config/networks'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import { isValidURL } from 'src/utils/url'
describe('Networks config files test', () => {
+ const environments = ['dev', 'staging', 'production']
+
const NETWORKS_PATH = 'src/config/networks/'
const configFiles = fs.readdirSync(NETWORKS_PATH)
const networksFileNames = configFiles
.filter((file) => !fs.lstatSync(`${NETWORKS_PATH}${file}`).isDirectory())
.filter((file) => {
- const [, extension] = file.split('.')
- return extension === 'ts'
+ const [fileName, extension] = file.split('.')
+ return extension === 'ts' && fileName !== 'index'
})
- const environments = ['dev', 'staging', 'production']
+ .map((file) => file.split('.')[0])
+
+ it(`should verify that the network file is exported in the networks/index.ts file`, () => {
+ networksFileNames.forEach((networkFileName) => {
+ const isValid = !!networks[networkFileName]
+
+ if (!isValid) {
+ console.log(`Network file "${networkFileName}" is not exported in "networks/index.ts"`)
+ }
+
+ expect(isValid).toBeTruthy()
+ })
+ })
environments.forEach((environment) => {
networksFileNames.forEach((networkFileName) => {
- it(`should validate "${environment}" environment URIs for ${networkFileName} config`, async () => {
+ it(`should validate "${environment}" environment URIs for ${networkFileName} config`, () => {
// Given
- const { default: networkConfig } = await import(`${NETWORKS_PATH}${networkFileName}`)
+ const networkConfig = networks[networkFileName]
// When
const networkConfigElement = networkConfig.environment[environment]
@@ -49,9 +63,9 @@ describe('Networks config files test', () => {
})
networksFileNames.forEach((networkFileName) => {
- it(`should have a valid 'decimal' value for 'nativeToken'`, async() => {
+ it(`should have a valid 'decimal' value for 'nativeToken'`, () => {
// Given
- const { default: networkConfig }: { default: NetworkConfig } = await import(`${NETWORKS_PATH}${networkFileName}`)
+ const networkConfig = networks[networkFileName]
// When
const { decimals } = networkConfig.network.nativeCoin
@@ -68,9 +82,9 @@ describe('Networks config files test', () => {
})
networksFileNames.forEach((networkFileName) => {
- it(`should have one of 'ETHEREUM_NETWORK' values for 'network.id'`, async() => {
+ it(`should have one of 'ETHEREUM_NETWORK' values for 'network.id'`, () => {
// Given
- const { default: networkConfig }: { default: NetworkConfig } = await import(`${NETWORKS_PATH}${networkFileName}`)
+ const networkConfig = networks[networkFileName]
// When
const { id } = networkConfig.network
@@ -87,9 +101,9 @@ describe('Networks config files test', () => {
})
networksFileNames.forEach((networkFileName) => {
- it(`should have a valid CSS color defined for 'network.color'`, async() => {
+ it(`should have a valid CSS color defined for 'network.color'`, () => {
// Given
- const { default: networkConfig }: { default: NetworkConfig } = await import(`${NETWORKS_PATH}${networkFileName}`)
+ const networkConfig = networks[networkFileName]
// When
const { color } = networkConfig.network
diff --git a/src/config/networks/index.ts b/src/config/networks/index.ts
new file mode 100644
index 0000000000..8944d16d91
--- /dev/null
+++ b/src/config/networks/index.ts
@@ -0,0 +1,11 @@
+import local from './local'
+import mainnet from './mainnet'
+import rinkeby from './rinkeby'
+import xdai from './xdai'
+
+export default {
+ local,
+ mainnet,
+ rinkeby,
+ xdai,
+}
diff --git a/src/config/networks/local.ts b/src/config/networks/local.ts
new file mode 100644
index 0000000000..195e315e38
--- /dev/null
+++ b/src/config/networks/local.ts
@@ -0,0 +1,35 @@
+import EtherLogo from 'src/assets/icons/icon_etherTokens.svg'
+import { EnvironmentSettings, ETHEREUM_NETWORK, NetworkConfig } from 'src/config/networks/network.d'
+
+const baseConfig: EnvironmentSettings = {
+ txServiceUrl: 'http://localhost:8000/api/v1/',
+ relayApiUrl: 'https://safe-relay.staging.gnosisdev.com/api/v1',
+ safeAppsUrl: 'http://localhost:3002/',
+ gasPriceOracleUrl: 'https://ethgasstation.info/json/ethgasAPI.json',
+ rpcServiceUrl: 'http://localhost:4447/',
+ networkExplorerName: 'Etherscan',
+ networkExplorerUrl: 'https://rinkeby.etherscan.io/',
+ networkExplorerApiUrl: 'https://api-rinkeby.etherscan.io/api',
+}
+
+const local: NetworkConfig = {
+ environment: {
+ production: {
+ ...baseConfig,
+ },
+ },
+ network: {
+ id: ETHEREUM_NETWORK.LOCAL,
+ color: '#E8673C',
+ label: 'LocalRPC',
+ nativeCoin: {
+ address: '0x000',
+ name: 'Ether',
+ symbol: 'ETH',
+ decimals: 18,
+ logoUri: EtherLogo,
+ },
+ },
+}
+
+export default local
diff --git a/src/config/networks/mainnet.ts b/src/config/networks/mainnet.ts
index d9f0fcf3ab..7635ada83e 100644
--- a/src/config/networks/mainnet.ts
+++ b/src/config/networks/mainnet.ts
@@ -1,6 +1,5 @@
import EtherLogo from 'src/assets/icons/icon_etherTokens.svg'
-import { EnvironmentSettings, NetworkConfig } from 'src/config/networks/network.d'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { EnvironmentSettings, ETHEREUM_NETWORK, NetworkConfig } from 'src/config/networks/network.d'
const baseConfig: EnvironmentSettings = {
txServiceUrl: 'https://safe-transaction.mainnet.staging.gnosisdev.com/api/v1/',
@@ -19,7 +18,7 @@ const mainnet: NetworkConfig = {
},
staging: {
...baseConfig,
- safeAppsUrl: 'https://safe-apps.staging.gnosisdev.com',
+ safeAppsUrl: 'https://safe-apps.staging.gnosisdev.com/',
},
production: {
...baseConfig,
diff --git a/src/config/networks/network.d.ts b/src/config/networks/network.d.ts
index 0d061a20c0..fd632d035b 100644
--- a/src/config/networks/network.d.ts
+++ b/src/config/networks/network.d.ts
@@ -1,5 +1,3 @@
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
-
// matches src/logic/tokens/store/model/token.ts `TokenProps` type
type Token = {
address: string
@@ -9,7 +7,22 @@ type Token = {
logoUri?: string
}
-type NetworkSettings = {
+export enum ETHEREUM_NETWORK {
+ MAINNET = 1,
+ MORDEN = 2,
+ ROPSTEN = 3,
+ RINKEBY = 4,
+ GOERLI = 5,
+ KOVAN = 42,
+ XDAI = 100,
+ ENERGY_WEB_CHAIN = 246,
+ VOLTA = 73799,
+ UNKNOWN = 0,
+ LOCAL = 4447,
+}
+
+export type NetworkSettings = {
+ // TODO: id now seems to be unnecessary
id: ETHEREUM_NETWORK,
color: string,
label: string,
@@ -19,7 +32,7 @@ type NetworkSettings = {
// something around this to display or not some critical sections in the app, depending on the network support
// I listed the ones that may conflict with the network.
// If non is present, all the sections are available.
-type SafeFeatures = {
+export type SafeFeatures = {
safeApps?: boolean,
collectibles?: boolean,
contractInteraction?: boolean
diff --git a/src/config/networks/rinkeby.ts b/src/config/networks/rinkeby.ts
index b37f04e002..7a6d78325f 100644
--- a/src/config/networks/rinkeby.ts
+++ b/src/config/networks/rinkeby.ts
@@ -1,6 +1,5 @@
import EtherLogo from 'src/assets/icons/icon_etherTokens.svg'
-import { EnvironmentSettings, NetworkConfig } from 'src/config/networks/network.d'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { EnvironmentSettings, ETHEREUM_NETWORK, NetworkConfig } from 'src/config/networks/network.d'
const baseConfig: EnvironmentSettings = {
txServiceUrl: 'https://safe-transaction.staging.gnosisdev.com/api/v1/',
diff --git a/src/config/networks/xdai.ts b/src/config/networks/xdai.ts
index 05a8aef442..d3a29a93e9 100644
--- a/src/config/networks/xdai.ts
+++ b/src/config/networks/xdai.ts
@@ -1,5 +1,4 @@
-import { NetworkConfig } from 'src/config/networks/network.d'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { ETHEREUM_NETWORK, NetworkConfig } from 'src/config/networks/network.d'
const xDai: NetworkConfig = {
environment: {
diff --git a/src/config/production-mainnet.ts b/src/config/production-mainnet.ts
deleted file mode 100644
index d24d20e19a..0000000000
--- a/src/config/production-mainnet.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-import prodConfig from './production'
-import { TX_SERVICE_HOST, RELAY_API_URL } from 'src/config/names'
-
-const prodMainnetConfig = {
- ...prodConfig,
- [TX_SERVICE_HOST]: 'https://safe-transaction.mainnet.gnosis.io/api/v1/',
- [RELAY_API_URL]: 'https://safe-relay.gnosis.io/api/v1/',
-}
-
-export default prodMainnetConfig
diff --git a/src/config/production.ts b/src/config/production.ts
deleted file mode 100644
index 246fcb9c71..0000000000
--- a/src/config/production.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { TX_SERVICE_HOST, SIGNATURES_VIA_METAMASK, RELAY_API_URL, SAFE_APPS_URL } from 'src/config/names'
-
-const prodConfig = {
- [TX_SERVICE_HOST]: 'https://safe-transaction.rinkeby.gnosis.io/api/v1/',
- [SIGNATURES_VIA_METAMASK]: false,
- [RELAY_API_URL]: 'https://safe-relay.rinkeby.gnosis.io/api/v1/',
- [SAFE_APPS_URL]: 'https://apps.gnosis-safe.io/'
-}
-
-export default prodConfig
diff --git a/src/config/staging-mainnet.ts b/src/config/staging-mainnet.ts
deleted file mode 100644
index 08f225fad6..0000000000
--- a/src/config/staging-mainnet.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-import stagingConfig from './staging'
-import { TX_SERVICE_HOST, RELAY_API_URL } from 'src/config/names'
-
-const stagingMainnetConfig = {
- ...stagingConfig,
- [TX_SERVICE_HOST]: 'https://safe-transaction.mainnet.staging.gnosisdev.com/api/v1/',
- [RELAY_API_URL]: 'https://safe-relay.mainnet.staging.gnosisdev.com/api/v1/',
-}
-
-export default stagingMainnetConfig
diff --git a/src/config/staging.ts b/src/config/staging.ts
deleted file mode 100644
index 61b4ebca25..0000000000
--- a/src/config/staging.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { TX_SERVICE_HOST, SIGNATURES_VIA_METAMASK, RELAY_API_URL, SAFE_APPS_URL } from 'src/config/names'
-
-const stagingConfig = {
- [TX_SERVICE_HOST]: 'https://safe-transaction.staging.gnosisdev.com/api/v1/',
- [SIGNATURES_VIA_METAMASK]: false,
- [RELAY_API_URL]: 'https://safe-relay.staging.gnosisdev.com/api/v1/',
- [SAFE_APPS_URL]: 'https://safe-apps.staging.gnosisdev.com'
-}
-
-export default stagingConfig
diff --git a/src/config/testing.ts b/src/config/testing.ts
deleted file mode 100644
index cce8aa963a..0000000000
--- a/src/config/testing.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { TX_SERVICE_HOST, SIGNATURES_VIA_METAMASK, RELAY_API_URL, SAFE_APPS_URL } from 'src/config/names'
-
-const testConfig = {
- [TX_SERVICE_HOST]: 'http://localhost:8000/api/v1/',
- [SIGNATURES_VIA_METAMASK]: false,
- [RELAY_API_URL]: 'https://safe-relay.staging.gnosisdev.com/api/v1',
- [SAFE_APPS_URL]: 'http://localhost:3002/'
-}
-
-export default testConfig
diff --git a/src/logic/collectibles/sources/OpenSea.ts b/src/logic/collectibles/sources/OpenSea.ts
index 2175ec59af..9e2c1a5076 100644
--- a/src/logic/collectibles/sources/OpenSea.ts
+++ b/src/logic/collectibles/sources/OpenSea.ts
@@ -1,6 +1,6 @@
import { RateLimit } from 'async-sema'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import NFTIcon from 'src/routes/safe/components/Balances/assets/nft_icon.png'
import { OPENSEA_API_KEY } from 'src/utils/constants'
diff --git a/src/logic/collectibles/store/actions/fetchCollectibles.ts b/src/logic/collectibles/store/actions/fetchCollectibles.ts
index c87e51df06..feb4dc2df1 100644
--- a/src/logic/collectibles/store/actions/fetchCollectibles.ts
+++ b/src/logic/collectibles/store/actions/fetchCollectibles.ts
@@ -1,13 +1,13 @@
import { batch } from 'react-redux'
-import { getNetwork } from 'src/config'
+import { getNetworkId } from 'src/config'
import { getConfiguredSource } from 'src/logic/collectibles/sources'
import { addNftAssets, addNftTokens } from 'src/logic/collectibles/store/actions/addCollectibles'
import { Dispatch } from 'redux'
const fetchCollectibles = (safeAddress: string) => async (dispatch: Dispatch): Promise => {
try {
- const network = getNetwork()
+ const network = getNetworkId()
const source = getConfiguredSource()
const collectibles = await source.fetchAllUserCollectiblesByCategoryAsync(safeAddress, network)
diff --git a/src/logic/contractInteraction/sources/EtherscanService.ts b/src/logic/contractInteraction/sources/EtherscanService.ts
index d9e7bfc5df..0c60e4092b 100644
--- a/src/logic/contractInteraction/sources/EtherscanService.ts
+++ b/src/logic/contractInteraction/sources/EtherscanService.ts
@@ -1,7 +1,7 @@
import { RateLimit } from 'async-sema'
import memoize from 'lodash.memoize'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import { ETHERSCAN_API_KEY } from 'src/utils/constants'
class EtherscanService {
diff --git a/src/logic/cookies/utils/index.ts b/src/logic/cookies/utils/index.ts
index 6be77a0ae8..7b9f8ce7ea 100644
--- a/src/logic/cookies/utils/index.ts
+++ b/src/logic/cookies/utils/index.ts
@@ -1,9 +1,8 @@
import Cookies from 'js-cookie'
-import { getNetwork } from 'src/config'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { getNetworkName } from 'src/config'
-const PREFIX = `v1_${ETHEREUM_NETWORK[getNetwork()]}`
+const PREFIX = `v1_${getNetworkName()}`
export const loadFromCookie = async (key) => {
try {
diff --git a/src/logic/currencyValues/__tests__/fetchSafeTokens.test.ts b/src/logic/currencyValues/__tests__/fetchSafeTokens.test.ts
index 32bf362ff5..7d9f35d0e4 100644
--- a/src/logic/currencyValues/__tests__/fetchSafeTokens.test.ts
+++ b/src/logic/currencyValues/__tests__/fetchSafeTokens.test.ts
@@ -1,7 +1,7 @@
import { aNewStore } from 'src/store'
import fetchTokenCurrenciesBalances from 'src/logic/currencyValues/api/fetchTokenCurrenciesBalances'
import axios from 'axios'
-import { getTxServiceHost } from 'src/config'
+import { getTxServiceUrl } from 'src/config'
jest.mock('axios')
describe('fetchTokenCurrenciesBalances', () => {
@@ -38,7 +38,7 @@ describe('fetchTokenCurrenciesBalances', () => {
usdConversion: '1.188',
},
]
- const apiUrl = getTxServiceHost()
+ const apiUrl = getTxServiceUrl()
// @ts-ignore
axios.get.mockImplementationOnce(() => Promise.resolve(expectedResult))
diff --git a/src/logic/currencyValues/api/fetchCurrenciesRates.ts b/src/logic/currencyValues/api/fetchCurrenciesRates.ts
index 00e2c48a1d..6f0c0f59f2 100644
--- a/src/logic/currencyValues/api/fetchCurrenciesRates.ts
+++ b/src/logic/currencyValues/api/fetchCurrenciesRates.ts
@@ -1,6 +1,6 @@
import axios from 'axios'
-import { getExchangeRatesUrl } from 'src/config'
+import { EXCHANGE_RATE_URL } from 'src/utils/constants'
import { AVAILABLE_CURRENCIES } from '../store/model/currencyValues'
import fetchTokenCurrenciesBalances from './fetchTokenCurrenciesBalances'
import BigNumber from 'bignumber.js'
@@ -25,7 +25,7 @@ const fetchCurrenciesRates = async (
}
try {
- const url = `${getExchangeRatesUrl()}?base=${baseCurrency}&symbols=${targetCurrencyValue}`
+ const url = `${EXCHANGE_RATE_URL}?base=${baseCurrency}&symbols=${targetCurrencyValue}`
const result = await axios.get(url)
if (result?.data) {
const { rates } = result.data
diff --git a/src/logic/currencyValues/api/fetchTokenCurrenciesBalances.ts b/src/logic/currencyValues/api/fetchTokenCurrenciesBalances.ts
index c2804708a9..28eba7e05d 100644
--- a/src/logic/currencyValues/api/fetchTokenCurrenciesBalances.ts
+++ b/src/logic/currencyValues/api/fetchTokenCurrenciesBalances.ts
@@ -1,6 +1,6 @@
import axios, { AxiosResponse } from 'axios'
-import { getTxServiceHost } from 'src/config'
+import { getTxServiceUrl } from 'src/config'
import { TokenProps } from 'src/logic/tokens/store/model/token'
export type BalanceEndpoint = {
@@ -15,7 +15,7 @@ const fetchTokenCurrenciesBalances = (
safeAddress: string,
excludeSpamTokens = true,
): Promise> => {
- const apiUrl = getTxServiceHost()
+ const apiUrl = getTxServiceUrl()
const url = `${apiUrl}safes/${safeAddress}/balances/usd/?exclude_spam=${excludeSpamTokens}`
return axios.get(url, {
diff --git a/src/logic/notifications/notificationTypes.ts b/src/logic/notifications/notificationTypes.ts
index 62fbe24744..d1b1b90cd7 100644
--- a/src/logic/notifications/notificationTypes.ts
+++ b/src/logic/notifications/notificationTypes.ts
@@ -1,8 +1,6 @@
import { OptionsObject } from 'notistack'
-import { getNetwork } from 'src/config'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
-import { capitalize } from 'src/utils/css'
+import { getNetworkName } from 'src/config'
export const SUCCESS = 'success'
export const ERROR = 'error'
@@ -199,7 +197,7 @@ export const NOTIFICATIONS: Record = {
options: { variant: WARNING, persist: true, preventDuplicate: true },
},
WRONG_NETWORK_MSG: {
- message: `Wrong network: Please use ${capitalize(ETHEREUM_NETWORK[getNetwork()])}`,
+ message: `Wrong network: Please use ${getNetworkName()}`,
options: { variant: WARNING, persist: true, preventDuplicate: true },
},
diff --git a/src/logic/safe/store/actions/allTransactions/loadAllTransactions.ts b/src/logic/safe/store/actions/allTransactions/loadAllTransactions.ts
index b054b123e8..6265ff024e 100644
--- a/src/logic/safe/store/actions/allTransactions/loadAllTransactions.ts
+++ b/src/logic/safe/store/actions/allTransactions/loadAllTransactions.ts
@@ -1,6 +1,6 @@
import axios, { AxiosResponse } from 'axios'
-import { getAllTransactionsUriFrom, getTxServiceHost } from 'src/config'
+import { getAllTransactionsUriFrom, getTxServiceUrl } from 'src/config'
import { checksumAddress } from 'src/utils/checksumAddress'
import { Transaction } from '../../models/types/transactions.d'
@@ -21,7 +21,7 @@ type TransactionDTO = {
}
const getAllTransactionsUri = (safeAddress: string): string => {
- const host = getTxServiceHost()
+ const host = getTxServiceUrl()
const address = checksumAddress(safeAddress)
const base = getAllTransactionsUriFrom(address)
diff --git a/src/logic/safe/transactions/incomingTxHistory.ts b/src/logic/safe/transactions/incomingTxHistory.ts
index c7d78e5476..e4597eb067 100644
--- a/src/logic/safe/transactions/incomingTxHistory.ts
+++ b/src/logic/safe/transactions/incomingTxHistory.ts
@@ -1,8 +1,8 @@
-import { getIncomingTxServiceUriTo, getTxServiceHost } from 'src/config'
+import { getIncomingTxServiceUriTo, getTxServiceUrl } from 'src/config'
import { checksumAddress } from 'src/utils/checksumAddress'
export const buildIncomingTxServiceUrl = (safeAddress: string): string => {
- const host = getTxServiceHost()
+ const host = getTxServiceUrl()
const address = checksumAddress(safeAddress)
const base = getIncomingTxServiceUriTo(address)
diff --git a/src/logic/safe/transactions/txHistory.ts b/src/logic/safe/transactions/txHistory.ts
index eeb144364f..b12300d2eb 100644
--- a/src/logic/safe/transactions/txHistory.ts
+++ b/src/logic/safe/transactions/txHistory.ts
@@ -1,7 +1,7 @@
import axios from 'axios'
import { GnosisSafe } from 'src/types/contracts/GnosisSafe.d'
-import { getTxServiceHost, getTxServiceUriFrom } from 'src/config'
+import { getTxServiceUrl, getTxServiceUriFrom } from 'src/config'
import { checksumAddress } from 'src/utils/checksumAddress'
const calculateBodyFrom = async (
@@ -45,7 +45,7 @@ const calculateBodyFrom = async (
}
export const buildTxServiceUrl = (safeAddress: string): string => {
- const host = getTxServiceHost()
+ const host = getTxServiceUrl()
const address = checksumAddress(safeAddress)
const base = getTxServiceUriFrom(address)
return `${host}${base}?has_confirmations=True`
diff --git a/src/logic/safe/utils/safeVersion.ts b/src/logic/safe/utils/safeVersion.ts
index 5fe5ee3460..25618a557b 100644
--- a/src/logic/safe/utils/safeVersion.ts
+++ b/src/logic/safe/utils/safeVersion.ts
@@ -3,8 +3,8 @@ import semverSatisfies from 'semver/functions/satisfies'
import semverValid from 'semver/functions/valid'
import { GnosisSafe } from 'src/types/contracts/GnosisSafe.d'
-import { getSafeLastVersion } from 'src/config'
import { getGnosisSafeInstanceAt, getSafeMasterContract } from 'src/logic/contracts/safeContracts'
+import { LATEST_SAFE_VERSION } from 'src/utils/constants'
export const FEATURES = [
{ name: 'ERC721', validVersion: '>=1.1.1' },
@@ -64,7 +64,7 @@ export const getCurrentMasterContractLastVersion = async (): Promise =>
} catch (err) {
// Default in case that it's not possible to obtain the version from the contract, returns a hardcoded value or an
// env variable
- safeMasterVersion = getSafeLastVersion()
+ safeMasterVersion = LATEST_SAFE_VERSION
}
return safeMasterVersion
}
diff --git a/src/logic/tokens/api/fetchTokenBalanceList.ts b/src/logic/tokens/api/fetchTokenBalanceList.ts
index c446858c45..91bdc399df 100644
--- a/src/logic/tokens/api/fetchTokenBalanceList.ts
+++ b/src/logic/tokens/api/fetchTokenBalanceList.ts
@@ -1,9 +1,9 @@
import axios from 'axios'
-import { getTxServiceHost } from 'src/config/index'
+import { getTxServiceUrl } from 'src/config/index'
const fetchTokenBalanceList = (safeAddress) => {
- const apiUrl = getTxServiceHost()
+ const apiUrl = getTxServiceUrl()
const url = `${apiUrl}safes/${safeAddress}/balances/`
return axios.get(url, {
diff --git a/src/logic/wallets/getWeb3.ts b/src/logic/wallets/getWeb3.ts
index fbe9854362..0b303d660e 100644
--- a/src/logic/wallets/getWeb3.ts
+++ b/src/logic/wallets/getWeb3.ts
@@ -1,27 +1,14 @@
-import { NETWORK } from 'src/utils/constants'
import Web3 from 'web3'
+import { provider as Provider } from 'web3-core'
+import { ContentHash } from 'web3-eth-ens'
+import { getNetworkId } from 'src/config'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
+import { NETWORK } from 'src/utils/constants'
import { sameAddress } from './ethAddresses'
import { EMPTY_DATA } from './ethTransactions'
-
-import { getNetwork } from 'src/config'
-import { ContentHash } from 'web3-eth-ens'
-import { provider as Provider } from 'web3-core'
import { ProviderProps } from './store/model/provider'
-export enum ETHEREUM_NETWORK {
- MAINNET = 1,
- MORDEN = 2,
- ROPSTEN = 3,
- RINKEBY = 4,
- GOERLI = 5,
- KOVAN = 42,
- XDAI = 100,
- ENERGY_WEB_CHAIN = 246,
- VOLTA = 73799,
- UNKNOWN = 0,
-}
-
export const WALLET_PROVIDER = {
SAFE: 'SAFE',
METAMASK: 'METAMASK',
@@ -51,7 +38,7 @@ export const getEtherScanLink = (network: ETHEREUM_NETWORK, type: ExplorerTypes,
}etherscan.io/${type}/${value}`
export const getExplorerLink = (type: ExplorerTypes, value: string): string => {
- const network = getNetwork()
+ const network = getNetworkId()
switch (network) {
case ETHEREUM_NETWORK.MAINNET:
diff --git a/src/logic/wallets/store/actions/fetchProvider.ts b/src/logic/wallets/store/actions/fetchProvider.ts
index 9e2390fdaa..c2907c67dc 100644
--- a/src/logic/wallets/store/actions/fetchProvider.ts
+++ b/src/logic/wallets/store/actions/fetchProvider.ts
@@ -2,10 +2,11 @@ import ReactGA from 'react-ga'
import addProvider from './addProvider'
-import { getNetwork } from 'src/config'
+import { getNetworkId } from 'src/config'
import { NOTIFICATIONS, enhanceSnackbarForAction } from 'src/logic/notifications'
import enqueueSnackbar from 'src/logic/notifications/store/actions/enqueueSnackbar'
-import { ETHEREUM_NETWORK, getProviderInfo, getWeb3 } from 'src/logic/wallets/getWeb3'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
+import { getProviderInfo, getWeb3 } from 'src/logic/wallets/getWeb3'
import { makeProvider } from 'src/logic/wallets/store/model/provider'
import { updateStoredTransactionsStatus } from 'src/logic/safe/store/actions/transactions/utils/transactionHelpers'
import { Dispatch } from 'redux'
@@ -24,11 +25,11 @@ const handleProviderNotification = (provider, dispatch) => {
return
}
- if (network !== getNetwork()) {
+ if (network !== getNetworkId()) {
dispatch(enqueueSnackbar(NOTIFICATIONS.WRONG_NETWORK_MSG))
return
}
- if (ETHEREUM_NETWORK.RINKEBY === getNetwork()) {
+ if (ETHEREUM_NETWORK.RINKEBY === getNetworkId()) {
dispatch(enqueueSnackbar(enhanceSnackbarForAction(NOTIFICATIONS.RINKEBY_VERSION_MSG)))
}
diff --git a/src/logic/wallets/store/model/provider.ts b/src/logic/wallets/store/model/provider.ts
index dd7c4c389a..146b2ddb70 100644
--- a/src/logic/wallets/store/model/provider.ts
+++ b/src/logic/wallets/store/model/provider.ts
@@ -1,5 +1,6 @@
import { Record, RecordOf } from 'immutable'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
export type ProviderProps = {
name: string
diff --git a/src/logic/wallets/store/selectors/index.ts b/src/logic/wallets/store/selectors/index.ts
index 51a0474006..56e41f67c8 100644
--- a/src/logic/wallets/store/selectors/index.ts
+++ b/src/logic/wallets/store/selectors/index.ts
@@ -1,6 +1,6 @@
import { createSelector } from 'reselect'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import { PROVIDER_REDUCER_ID, ProviderState } from 'src/logic/wallets/store/reducer/provider'
import { AppReduxState } from 'src/store'
diff --git a/src/logic/wallets/utils/walletList.ts b/src/logic/wallets/utils/walletList.ts
index 0921a76ae9..8fcf755c3e 100644
--- a/src/logic/wallets/utils/walletList.ts
+++ b/src/logic/wallets/utils/walletList.ts
@@ -1,5 +1,5 @@
import { getInfuraUrl, getRPCUrl } from '../getWeb3'
-import { getNetwork } from 'src/config'
+import { getNetworkId } from 'src/config'
const isMainnet = process.env.REACT_APP_NETWORK === 'mainnet'
@@ -7,7 +7,7 @@ const PORTIS_DAPP_ID = isMainnet ? process.env.REACT_APP_PORTIS_ID : '852b763d-f
// const SQUARELINK_CLIENT_ID = isMainnet ? process.env.REACT_APP_SQUARELINK_ID : '46ce08fe50913cfa1b78'
const FORTMATIC_API_KEY = isMainnet ? process.env.REACT_APP_FORTMATIC_KEY : 'pk_test_CAD437AA29BE0A40'
-const network = getNetwork()
+const network = getNetworkId()
const infuraUrl = getInfuraUrl(network)
const wallets = [
diff --git a/src/routes/load/container/Load.tsx b/src/routes/load/container/Load.tsx
index efa6ba79ca..6e4b530568 100644
--- a/src/routes/load/container/Load.tsx
+++ b/src/routes/load/container/Load.tsx
@@ -1,6 +1,6 @@
import * as React from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import Layout from 'src/routes/load/components/Layout'
import { FIELD_LOAD_ADDRESS, FIELD_LOAD_NAME } from '../components/fields'
diff --git a/src/routes/safe/components/Apps/hooks/useIframeMessageHandler.ts b/src/routes/safe/components/Apps/hooks/useIframeMessageHandler.ts
index 590402807b..966c988bda 100644
--- a/src/routes/safe/components/Apps/hooks/useIframeMessageHandler.ts
+++ b/src/routes/safe/components/Apps/hooks/useIframeMessageHandler.ts
@@ -12,13 +12,13 @@ import {
} from '@gnosis.pm/safe-apps-sdk'
import { useDispatch, useSelector } from 'react-redux'
import { useEffect, useCallback, MutableRefObject } from 'react'
-import { getTxServiceHost } from 'src/config/'
+import { getTxServiceUrl } from 'src/config/'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import {
safeEthBalanceSelector,
safeNameSelector,
safeParamAddressFromStateSelector,
} from 'src/logic/safe/store/selectors'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
import { networkSelector } from 'src/logic/wallets/store/selectors'
import { SafeApp } from 'src/routes/safe/components/Apps/types.d'
@@ -98,7 +98,7 @@ const useIframeMessageHandler = (
const envInfoMessage = {
messageId: INTERFACE_MESSAGES.ENV_INFO,
data: {
- txServiceUrl: getTxServiceHost(),
+ txServiceUrl: getTxServiceUrl(),
},
}
diff --git a/src/routes/safe/components/Apps/index.tsx b/src/routes/safe/components/Apps/index.tsx
index 9de471bdac..bc72ec224e 100644
--- a/src/routes/safe/components/Apps/index.tsx
+++ b/src/routes/safe/components/Apps/index.tsx
@@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useRef, useState, useMemo } from 'react'
import { INTERFACE_MESSAGES, Transaction, RequestId, LowercaseNetworks } from '@gnosis.pm/safe-apps-sdk'
import { Card, IconText, Loader, Menu, Title } from '@gnosis.pm/safe-react-components'
import { useSelector } from 'react-redux'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { ETHEREUM_NETWORK } from 'src/config/networks/network.d'
import styled, { css } from 'styled-components'
import ManageApps from './components/ManageApps'
diff --git a/src/routes/safe/components/Apps/utils.ts b/src/routes/safe/components/Apps/utils.ts
index beeba0c089..74358ab12b 100644
--- a/src/routes/safe/components/Apps/utils.ts
+++ b/src/routes/safe/components/Apps/utils.ts
@@ -3,7 +3,7 @@ import memoize from 'lodash.memoize'
import { SafeApp } from './types.d'
-import { getGnosisSafeAppsUrl } from 'src/config/index'
+import { getGnosisSafeAppsUrl } from 'src/config'
import { getContentFromENS } from 'src/logic/wallets/getWeb3'
import appsIconSvg from 'src/routes/safe/components/Transactions/TxsTable/TxType/assets/appsIcon.svg'
diff --git a/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/utils/index.ts b/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/utils/index.ts
index 52922fd024..125462fc02 100644
--- a/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/utils/index.ts
+++ b/src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/utils/index.ts
@@ -3,7 +3,7 @@ import createDecorator from 'final-form-calculate'
import { ContractSendMethod } from 'web3-eth-contract'
import { mustBeEthereumAddress, mustBeEthereumContractAddress } from 'src/components/forms/validator'
-import { getNetwork } from 'src/config'
+import { getNetworkId } from 'src/config'
import { getConfiguredSource } from 'src/logic/contractInteraction/sources'
import { AbiItemExtended } from 'src/logic/contractInteraction/sources/ABIService'
import { getAddressFromENS, getWeb3 } from 'src/logic/wallets/getWeb3'
@@ -23,7 +23,7 @@ export const abiExtractor = createDecorator({
) {
return
}
- const network = getNetwork()
+ const network = getNetworkId()
const source = getConfiguredSource()
return source.getContractABI(contractAddress, network)
},
diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/CreationTx/index.tsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/CreationTx/index.tsx
index 181722bda6..d70ac9d498 100644
--- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/CreationTx/index.tsx
+++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/CreationTx/index.tsx
@@ -1,10 +1,9 @@
import { makeStyles } from '@material-ui/core/styles'
import React from 'react'
import { EthHashInfo } from '@gnosis.pm/safe-react-components'
-import { getNetwork } from 'src/config'
+import { getNetworkName } from 'src/config'
import { Transaction } from 'src/logic/safe/store/models/types/transaction'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
import { formatDate } from 'src/routes/safe/components/Transactions/TxsTable/columns'
import Bold from 'src/components/layout/Bold'
import Paragraph from 'src/components/layout/Paragraph'
@@ -47,13 +46,7 @@ export const CreationTx = ({ tx }: Props): React.ReactElement | null => {
Creator:
{tx.creator ? (
-
+
) : (
'n/a'
)}
@@ -66,7 +59,7 @@ export const CreationTx = ({ tx }: Props): React.ReactElement | null => {
shortenHash={4}
showCopyBtn
showEtherscanBtn
- network={ETHEREUM_NETWORK[getNetwork()]}
+ network={getNetworkName()}
/>
) : (
'n/a'
@@ -75,13 +68,7 @@ export const CreationTx = ({ tx }: Props): React.ReactElement | null => {
Mastercopy:
{tx.masterCopy ? (
-
+
) : (
'n/a'
)}
diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.tsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.tsx
index 0d2348d022..fc973f8670 100644
--- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.tsx
+++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/OwnersColumn/OwnerComponent.tsx
@@ -3,8 +3,6 @@ import cn from 'classnames'
import React from 'react'
import { useSelector } from 'react-redux'
import { EthHashInfo } from '@gnosis.pm/safe-react-components'
-import { getNetwork } from 'src/config'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
import CancelSmallFilledCircle from './assets/cancel-small-filled.svg'
import ConfirmSmallFilledCircle from './assets/confirm-small-filled.svg'
@@ -14,6 +12,7 @@ import ConfirmSmallRedCircle from './assets/confirm-small-red.svg'
import PendingSmallYellowCircle from './assets/confirm-small-yellow.svg'
import { styles } from './style'
+import { getNetworkName } from 'src/config'
import Block from 'src/components/layout/Block'
import Button from 'src/components/layout/Button'
import Img from 'src/components/layout/Img'
@@ -184,7 +183,7 @@ const OwnerComponent = (props: OwnerComponentProps): React.ReactElement => {
showIdenticon
showCopyBtn
showEtherscanBtn
- network={ETHEREUM_NETWORK[getNetwork()]}
+ network={getNetworkName()}
/>
{owner === userAddress && {isCancelTx ? rejectButton() : confirmButton()}}
diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/CustomDescription.tsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/CustomDescription.tsx
index 030f00a7f5..10353ded90 100644
--- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/CustomDescription.tsx
+++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/CustomDescription.tsx
@@ -1,7 +1,6 @@
import { IconText, Text, EthHashInfo } from '@gnosis.pm/safe-react-components'
import { makeStyles } from '@material-ui/core/styles'
import React from 'react'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
import styled from 'styled-components'
import { styles } from './styles'
@@ -24,7 +23,7 @@ import { Transaction } from 'src/logic/safe/store/models/types/transaction'
import { DataDecoded } from 'src/routes/safe/store/models/types/transactions.d'
import DividerLine from 'src/components/DividerLine'
import { isArrayParameter } from 'src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/utils'
-import { getNetwork } from 'src/config'
+import { getNetworkName } from 'src/config'
export const TRANSACTIONS_DESC_CUSTOM_VALUE_TEST_ID = 'tx-description-custom-value'
export const TRANSACTIONS_DESC_CUSTOM_DATA_TEST_ID = 'tx-description-custom-data'
@@ -86,13 +85,7 @@ const MultiSendCustomDataAction = ({ tx, order }: { tx: MultiSendDetails; order:
Send {humanReadableValue(tx.value)} ETH to:
-
+
{!!tx.data && }
@@ -196,7 +189,7 @@ const GenericCustomData = ({ amount = '0', data, recipient, storedTx }: GenericC
showIdenticon
showCopyBtn
showEtherscanBtn
- network={ETHEREUM_NETWORK[getNetwork()]}
+ network={getNetworkName()}
/>
diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/Value.tsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/Value.tsx
index ae46d2e15e..d773789a88 100644
--- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/Value.tsx
+++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/Value.tsx
@@ -1,9 +1,8 @@
import { Text, EthHashInfo } from '@gnosis.pm/safe-react-components'
import React from 'react'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
import styled from 'styled-components'
-import { getNetwork } from 'src/config'
+import { getNetworkName } from 'src/config'
import {
isAddress,
isArrayParameter,
@@ -58,7 +57,7 @@ const Value = ({ type, ...props }: RenderValueProps): React.ReactElement => {
showCopyBtn
showEtherscanBtn
shortenHash={4}
- network={ETHEREUM_NETWORK[getNetwork()]}
+ network={getNetworkName()}
/>
)
}
diff --git a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/index.tsx b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/index.tsx
index ce655808a2..b9b31884aa 100644
--- a/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/index.tsx
+++ b/src/routes/safe/components/Transactions/TxsTable/ExpandedTx/index.tsx
@@ -13,7 +13,7 @@ import { CreationTx } from './CreationTx'
import { OutgoingTx } from './OutgoingTx'
import { styles } from './style'
-import { getNetwork } from 'src/config'
+import { getNetworkName } from 'src/config'
import Block from 'src/components/layout/Block'
import Bold from 'src/components/layout/Bold'
import Col from 'src/components/layout/Col'
@@ -21,7 +21,7 @@ import Hairline from 'src/components/layout/Hairline'
import Paragraph from 'src/components/layout/Paragraph'
import Row from 'src/components/layout/Row'
import Span from 'src/components/layout/Span'
-import { ETHEREUM_NETWORK, getWeb3 } from 'src/logic/wallets/getWeb3'
+import { getWeb3 } from 'src/logic/wallets/getWeb3'
import { INCOMING_TX_TYPES } from 'src/logic/safe/store/models/incomingTransaction'
import { safeNonceSelector, safeThresholdSelector } from 'src/logic/safe/store/selectors'
import { Transaction, TransactionTypes } from 'src/logic/safe/store/models/types/transaction'
@@ -73,7 +73,7 @@ const ExpandedTx = ({ cancelTx, tx }: ExpandedTxProps): React.ReactElement => {
shortenHash={4}
showCopyBtn
showEtherscanBtn
- network={ETHEREUM_NETWORK[getNetwork()]}
+ network={getNetworkName()}
/>
) : (
'n/a'
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
index b873693fb3..44fb98ee27 100644
--- a/src/utils/constants.ts
+++ b/src/utils/constants.ts
@@ -1,14 +1,20 @@
-export const NETWORK = process.env.REACT_APP_NETWORK || 'RINKEBY'
-export const GOOGLE_ANALYTICS_ID_RINKEBY = process.env.REACT_APP_GOOGLE_ANALYTICS_ID_RINKEBY
-export const GOOGLE_ANALYTICS_ID_MAINNET = process.env.REACT_APP_GOOGLE_ANALYTICS_ID_MAINNET
-export const INTERCOM_ID = process.env.REACT_APP_INTERCOM_ID
+export const APP_ENV = process.env.REACT_APP_ENV
+export const NODE_ENV = process.env.NODE_ENV
+export const NETWORK = process.env.REACT_APP_NETWORK?.toUpperCase() || 'RINKEBY'
+export const GOOGLE_ANALYTICS_ID = {
+ RINKEBY: process.env.REACT_APP_GOOGLE_ANALYTICS_ID_RINKEBY,
+ MAINNET: process.env.REACT_APP_GOOGLE_ANALYTICS_ID_MAINNET,
+}
+export const INTERCOM_ID = process.env.REACT_APP_ENV === 'production' ? process.env.REACT_APP_INTERCOM_ID : 'plssl1fl'
export const PORTIS_ID = process.env.REACT_APP_PORTIS_ID
export const SQUARELINK_ID = process.env.REACT_APP_SQUARELINK_ID
export const FORTMATIC_KEY = process.env.REACT_APP_FORTMATIC_KEY
export const INFURA_TOKEN = process.env.REACT_APP_INFURA_TOKEN || ''
-export const LATEST_SAFE_VERSION = process.env.REACT_APP_LATEST_SAFE_VERSION || 'not-defined'
+export const LATEST_SAFE_VERSION = process.env.REACT_APP_LATEST_SAFE_VERSION || '1.1.1'
export const APP_VERSION = process.env.REACT_APP_APP_VERSION || 'not-defined'
export const OPENSEA_API_KEY = process.env.REACT_APP_OPENSEA_API_KEY || ''
export const COLLECTIBLES_SOURCE = process.env.REACT_APP_COLLECTIBLES_SOURCE || 'OpenSea'
export const TIMEOUT = process.env.NODE_ENV === 'test' ? 1500 : 5000
export const ETHERSCAN_API_KEY = process.env.REACT_APP_ETHERSCAN_API_KEY
+export const EXCHANGE_RATE_URL = 'https://api.exchangeratesapi.io/latest'
+export const EXCHANGE_RATE_URL_FALLBACK = 'https://api.coinbase.com/v2/exchange-rates'
diff --git a/src/utils/intercom.ts b/src/utils/intercom.ts
index 6fb98cbf97..68035e7d98 100644
--- a/src/utils/intercom.ts
+++ b/src/utils/intercom.ts
@@ -1,8 +1,8 @@
-import { getIntercomId } from 'src/config'
+import { INTERCOM_ID } from 'src/utils/constants'
// eslint-disable-next-line consistent-return
export const loadIntercom = () => {
- const APP_ID = getIntercomId()
+ const APP_ID = INTERCOM_ID
if (!APP_ID) {
console.error('[Intercom] - In order to use Intercom you need to add an appID')
return null
diff --git a/src/utils/storage/index.ts b/src/utils/storage/index.ts
index dcc3f5564b..d9f7a13328 100644
--- a/src/utils/storage/index.ts
+++ b/src/utils/storage/index.ts
@@ -1,7 +1,6 @@
import { ImmortalStorage, IndexedDbStore, LocalStorageStore } from 'immortal-db'
-import { getNetwork } from 'src/config'
-import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
+import { getNetworkName } from 'src/config'
// Don't use sessionStorage and cookieStorage
// https://github.com/gruns/ImmortalDB/issues/22
@@ -9,7 +8,7 @@ import { ETHEREUM_NETWORK } from 'src/logic/wallets/getWeb3'
const stores = [IndexedDbStore, LocalStorageStore]
export const storage = new ImmortalStorage(stores)
-const PREFIX = `v2_${ETHEREUM_NETWORK[getNetwork()]}`
+const PREFIX = `v2_${getNetworkName()}`
export const loadFromStorage = async (key: string): Promise => {
try {