diff --git a/common/config/networks.ts b/common/config/networks.ts index 2288563a..98d74f70 100644 --- a/common/config/networks.ts +++ b/common/config/networks.ts @@ -1,74 +1,5 @@ -import { ethPlorer, ETHTokenExplorer, SecureWalletName, InsecureWalletName } from './data'; import { EtherscanNode, InfuraNode, RPCNode, Web3Node } from 'libs/nodes'; import { networkIdToName } from 'libs/values'; -import { - ETH_DEFAULT, - ETH_TREZOR, - ETH_LEDGER, - ETC_LEDGER, - ETC_TREZOR, - ETH_TESTNET, - EXP_DEFAULT, - UBQ_DEFAULT, - DPath -} from 'config/dpaths'; - -export interface BlockExplorerConfig { - origin: string; - txUrl(txHash: string): string; - addressUrl(address: string): string; -} - -export interface Token { - address: string; - symbol: string; - decimal: number; - error?: string | null; -} - -export interface NetworkContract { - name: NetworkKeys; - address?: string; - abi: string; -} - -export interface DPathFormats { - trezor: DPath; - ledgerNanoS: DPath; - mnemonicPhrase: DPath; -} - -export interface NetworkConfig { - // TODO really try not to allow strings due to custom networks - name: NetworkKeys; - unit: string; - color?: string; - blockExplorer?: BlockExplorerConfig; - tokenExplorer?: { - name: string; - address(address: string): string; - }; - chainId: number; - tokens: Token[]; - contracts: NetworkContract[] | null; - dPathFormats: DPathFormats; - isTestnet?: boolean; -} - -export interface CustomNetworkConfig { - name: string; - unit: string; - chainId: number; - dPathFormats: DPathFormats | null; -} - -export interface NodeConfig { - network: NetworkKeys; - lib: RPCNode | Web3Node; - service: string; - estimateGas?: boolean; - hidden?: boolean; -} export interface CustomNodeConfig { name: string; @@ -81,140 +12,14 @@ export interface CustomNodeConfig { }; } -// Must be a website that follows the ethplorer convention of /tx/[hash] and -// address/[address] to generate the correct functions. -function makeExplorer(origin: string): BlockExplorerConfig { - return { - origin, - txUrl: hash => `${origin}/tx/${hash}`, - addressUrl: address => `${origin}/address/${address}` - }; +export interface NodeConfig { + network: NetworkKeys; + lib: RPCNode | Web3Node; + service: string; + estimateGas?: boolean; + hidden?: boolean; } -const ETH: NetworkConfig = { - name: 'ETH', - unit: 'ETH', - chainId: 1, - color: '#0e97c0', - blockExplorer: makeExplorer('https://etherscan.io'), - tokenExplorer: { - name: ethPlorer, - address: ETHTokenExplorer - }, - tokens: require('./tokens/eth.json'), - contracts: require('./contracts/eth.json'), - dPathFormats: { - [SecureWalletName.TREZOR]: ETH_TREZOR, - [SecureWalletName.LEDGER_NANO_S]: ETH_LEDGER, - [InsecureWalletName.MNEMONIC_PHRASE]: ETH_DEFAULT - } -}; - -const Ropsten: NetworkConfig = { - name: 'Ropsten', - unit: 'ETH', - chainId: 3, - color: '#adc101', - blockExplorer: makeExplorer('https://ropsten.etherscan.io'), - tokens: require('./tokens/ropsten.json'), - contracts: require('./contracts/ropsten.json'), - isTestnet: true, - dPathFormats: { - [SecureWalletName.TREZOR]: ETH_TESTNET, - [SecureWalletName.LEDGER_NANO_S]: ETH_TESTNET, - [InsecureWalletName.MNEMONIC_PHRASE]: ETH_TESTNET - } -}; - -const Kovan: NetworkConfig = { - name: 'Kovan', - unit: 'ETH', - chainId: 42, - color: '#adc101', - blockExplorer: makeExplorer('https://kovan.etherscan.io'), - tokens: require('./tokens/ropsten.json'), - contracts: require('./contracts/ropsten.json'), - isTestnet: true, - dPathFormats: { - [SecureWalletName.TREZOR]: ETH_TESTNET, - [SecureWalletName.LEDGER_NANO_S]: ETH_TESTNET, - [InsecureWalletName.MNEMONIC_PHRASE]: ETH_TESTNET - } -}; - -const Rinkeby: NetworkConfig = { - name: 'Rinkeby', - unit: 'ETH', - chainId: 4, - color: '#adc101', - blockExplorer: makeExplorer('https://rinkeby.etherscan.io'), - tokens: require('./tokens/rinkeby.json'), - contracts: require('./contracts/rinkeby.json'), - isTestnet: true, - dPathFormats: { - [SecureWalletName.TREZOR]: ETH_TESTNET, - [SecureWalletName.LEDGER_NANO_S]: ETH_TESTNET, - [InsecureWalletName.MNEMONIC_PHRASE]: ETH_TESTNET - } -}; - -const ETC: NetworkConfig = { - name: 'ETC', - unit: 'ETC', - chainId: 61, - color: '#669073', - blockExplorer: makeExplorer('https://gastracker.io'), - tokens: require('./tokens/etc.json'), - contracts: require('./contracts/etc.json'), - dPathFormats: { - [SecureWalletName.TREZOR]: ETC_TREZOR, - [SecureWalletName.LEDGER_NANO_S]: ETC_LEDGER, - [InsecureWalletName.MNEMONIC_PHRASE]: ETC_TREZOR - } -}; - -const UBQ: NetworkConfig = { - name: 'UBQ', - unit: 'UBQ', - chainId: 8, - color: '#b37aff', - blockExplorer: makeExplorer('https://ubiqscan.io/en'), - tokens: require('./tokens/ubq.json'), - contracts: require('./contracts/ubq.json'), - dPathFormats: { - [SecureWalletName.TREZOR]: UBQ_DEFAULT, - [SecureWalletName.LEDGER_NANO_S]: UBQ_DEFAULT, - [InsecureWalletName.MNEMONIC_PHRASE]: UBQ_DEFAULT - } -}; - -const EXP: NetworkConfig = { - name: 'EXP', - unit: 'EXP', - chainId: 2, - color: '#673ab7', - blockExplorer: makeExplorer('http://www.gander.tech'), - tokens: require('./tokens/exp.json'), - contracts: require('./contracts/exp.json'), - dPathFormats: { - [SecureWalletName.TREZOR]: EXP_DEFAULT, - [SecureWalletName.LEDGER_NANO_S]: EXP_DEFAULT, - [InsecureWalletName.MNEMONIC_PHRASE]: EXP_DEFAULT - } -}; - -export const NETWORKS = { - ETH, - Ropsten, - Kovan, - Rinkeby, - ETC, - UBQ, - EXP -}; - -export type NetworkKeys = keyof typeof NETWORKS; - enum NodeName { ETH_MEW = 'eth_mew', ETH_MYCRYPTO = 'eth_mycrypto', diff --git a/common/reducers/config/index.ts b/common/reducers/config/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/common/reducers/config/meta.ts b/common/reducers/config/meta.ts new file mode 100644 index 00000000..e69de29b diff --git a/common/reducers/config/networks/customNetworks.ts b/common/reducers/config/networks/customNetworks.ts new file mode 100644 index 00000000..e69de29b diff --git a/common/reducers/config/networks/defaultNetworks.ts b/common/reducers/config/networks/defaultNetworks.ts new file mode 100644 index 00000000..03f30893 --- /dev/null +++ b/common/reducers/config/networks/defaultNetworks.ts @@ -0,0 +1,136 @@ +import { ethPlorer, ETHTokenExplorer, SecureWalletName, InsecureWalletName } from 'config/data'; +import { + ETH_DEFAULT, + ETH_TREZOR, + ETH_LEDGER, + ETC_LEDGER, + ETC_TREZOR, + ETH_TESTNET, + EXP_DEFAULT, + UBQ_DEFAULT +} from 'config/dpaths'; +import { + NetworkConfig, + BlockExplorerConfig, + DefaultNetworkKeys +} from 'reducers/config/networks/typings'; + +export type State = { [key in DefaultNetworkKeys]: NetworkConfig }; + +// Must be a website that follows the ethplorer convention of /tx/[hash] and +// address/[address] to generate the correct functions. +function makeExplorer(origin: string): BlockExplorerConfig { + return { + origin, + txUrl: hash => `${origin}/tx/${hash}`, + addressUrl: address => `${origin}/address/${address}` + }; +} + +const INITIAL_STATE = { + ETH: { + name: 'ETH', + unit: 'ETH', + chainId: 1, + color: '#0e97c0', + blockExplorer: makeExplorer('https://etherscan.io'), + tokenExplorer: { + name: ethPlorer, + address: ETHTokenExplorer + }, + tokens: require('./tokens/eth.json'), + contracts: require('./contracts/eth.json'), + dPathFormats: { + [SecureWalletName.TREZOR]: ETH_TREZOR, + [SecureWalletName.LEDGER_NANO_S]: ETH_LEDGER, + [InsecureWalletName.MNEMONIC_PHRASE]: ETH_DEFAULT + } + }, + Ropsten: { + name: 'Ropsten', + unit: 'ETH', + chainId: 3, + color: '#adc101', + blockExplorer: makeExplorer('https://ropsten.etherscan.io'), + tokens: require('./tokens/ropsten.json'), + contracts: require('./contracts/ropsten.json'), + isTestnet: true, + dPathFormats: { + [SecureWalletName.TREZOR]: ETH_TESTNET, + [SecureWalletName.LEDGER_NANO_S]: ETH_TESTNET, + [InsecureWalletName.MNEMONIC_PHRASE]: ETH_TESTNET + } + }, + Kovan: { + name: 'Kovan', + unit: 'ETH', + chainId: 42, + color: '#adc101', + blockExplorer: makeExplorer('https://kovan.etherscan.io'), + tokens: require('./tokens/ropsten.json'), + contracts: require('./contracts/ropsten.json'), + isTestnet: true, + dPathFormats: { + [SecureWalletName.TREZOR]: ETH_TESTNET, + [SecureWalletName.LEDGER_NANO_S]: ETH_TESTNET, + [InsecureWalletName.MNEMONIC_PHRASE]: ETH_TESTNET + } + }, + Rinkeby: { + name: 'Rinkeby', + unit: 'ETH', + chainId: 4, + color: '#adc101', + blockExplorer: makeExplorer('https://rinkeby.etherscan.io'), + tokens: require('./tokens/rinkeby.json'), + contracts: require('./contracts/rinkeby.json'), + isTestnet: true, + dPathFormats: { + [SecureWalletName.TREZOR]: ETH_TESTNET, + [SecureWalletName.LEDGER_NANO_S]: ETH_TESTNET, + [InsecureWalletName.MNEMONIC_PHRASE]: ETH_TESTNET + } + }, + ETC: { + name: 'ETC', + unit: 'ETC', + chainId: 61, + color: '#669073', + blockExplorer: makeExplorer('https://gastracker.io'), + tokens: require('./tokens/etc.json'), + contracts: require('./contracts/etc.json'), + dPathFormats: { + [SecureWalletName.TREZOR]: ETC_TREZOR, + [SecureWalletName.LEDGER_NANO_S]: ETC_LEDGER, + [InsecureWalletName.MNEMONIC_PHRASE]: ETC_TREZOR + } + }, + UBQ: { + name: 'UBQ', + unit: 'UBQ', + chainId: 8, + color: '#b37aff', + blockExplorer: makeExplorer('https://ubiqscan.io/en'), + tokens: require('./tokens/ubq.json'), + contracts: require('./contracts/ubq.json'), + dPathFormats: { + [SecureWalletName.TREZOR]: UBQ_DEFAULT, + [SecureWalletName.LEDGER_NANO_S]: UBQ_DEFAULT, + [InsecureWalletName.MNEMONIC_PHRASE]: UBQ_DEFAULT + } + }, + EXP: { + name: 'EXP', + unit: 'EXP', + chainId: 2, + color: '#673ab7', + blockExplorer: makeExplorer('http://www.gander.tech'), + tokens: require('./tokens/exp.json'), + contracts: require('./contracts/exp.json'), + dPathFormats: { + [SecureWalletName.TREZOR]: EXP_DEFAULT, + [SecureWalletName.LEDGER_NANO_S]: EXP_DEFAULT, + [InsecureWalletName.MNEMONIC_PHRASE]: EXP_DEFAULT + } + } +}; diff --git a/common/reducers/config/networks/index.ts b/common/reducers/config/networks/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/common/reducers/config/networks/selectedNetwork.ts b/common/reducers/config/networks/selectedNetwork.ts new file mode 100644 index 00000000..e69de29b diff --git a/common/reducers/config/networks/typings.ts b/common/reducers/config/networks/typings.ts new file mode 100644 index 00000000..7f31d1b0 --- /dev/null +++ b/common/reducers/config/networks/typings.ts @@ -0,0 +1,52 @@ +import { DPath } from 'config/dpaths'; + +export type DefaultNetworkKeys = 'ETH' | 'Ropsten' | 'Kovan' | 'Rinkeby' | 'ETC' | 'UBQ' | 'EXP'; + +export interface BlockExplorerConfig { + origin: string; + txUrl(txHash: string): string; + addressUrl(address: string): string; +} + +export interface Token { + address: string; + symbol: string; + decimal: number; + error?: string | null; +} + +export interface NetworkContract { + name: DefaultNetworkKeys; + address?: string; + abi: string; +} + +export interface DPathFormats { + trezor: DPath; + ledgerNanoS: DPath; + mnemonicPhrase: DPath; +} + +export interface NetworkConfig { + // TODO really try not to allow strings due to custom networks + name: DefaultNetworkKeys; + unit: string; + color?: string; + blockExplorer?: BlockExplorerConfig; + tokenExplorer?: { + name: string; + address(address: string): string; + }; + chainId: number; + tokens: Token[]; + contracts: NetworkContract[] | null; + dPathFormats: DPathFormats; + isTestnet?: boolean; +} + +export interface CustomNetworkConfig { + name: string; + unit: string; + chainId: number; + dPathFormats: DPathFormats | null; +} diff --git a/common/reducers/config/nodes.ts b/common/reducers/config/nodes.ts new file mode 100644 index 00000000..e69de29b