uniswap-interface-uncensored/src/utils/switchChain.ts
cartcrom 839d4ac8e2
refactor: adding safe getter for ChainInfo (#4110)
* replaced CHAIN_INFO access with a function call
* updated CTACard tests to work with getChainInfo
* updated typechecking, removed console.log
2022-07-14 11:52:37 -04:00

76 lines
2.6 KiB
TypeScript

import { Connector } from '@web3-react/types'
import {
coinbaseWalletConnection,
fortmaticConnection,
gnosisSafeConnection,
injectedConnection,
networkConnection,
walletConnectConnection,
} from 'connection'
import { getChainInfo } from 'constants/chainInfo'
import { ALL_SUPPORTED_CHAIN_IDS, SupportedChainId } from 'constants/chains'
import { RPC_URLS } from 'constants/networks'
function getRpcUrls(chainId: SupportedChainId): [string] {
switch (chainId) {
case SupportedChainId.MAINNET:
case SupportedChainId.RINKEBY:
case SupportedChainId.ROPSTEN:
case SupportedChainId.KOVAN:
case SupportedChainId.GOERLI:
return [RPC_URLS[chainId]]
case SupportedChainId.OPTIMISM:
return ['https://mainnet.optimism.io']
case SupportedChainId.OPTIMISTIC_KOVAN:
return ['https://kovan.optimism.io']
case SupportedChainId.ARBITRUM_ONE:
return ['https://arb1.arbitrum.io/rpc']
case SupportedChainId.ARBITRUM_RINKEBY:
return ['https://rinkeby.arbitrum.io/rpc']
case SupportedChainId.POLYGON:
return ['https://polygon-rpc.com/']
case SupportedChainId.POLYGON_MUMBAI:
return ['https://rpc-endpoints.superfluid.dev/mumbai']
case SupportedChainId.CELO:
return ['https://forno.celo.org']
case SupportedChainId.CELO_ALFAJORES:
return ['https://alfajores-forno.celo-testnet.org']
default:
}
// Our API-keyed URLs will fail security checks when used with external wallets.
throw new Error('RPC URLs must use public endpoints')
}
export function isChainAllowed(connector: Connector, chainId: number) {
switch (connector) {
case fortmaticConnection.connector:
return chainId === SupportedChainId.MAINNET
case injectedConnection.connector:
case coinbaseWalletConnection.connector:
case walletConnectConnection.connector:
case networkConnection.connector:
case gnosisSafeConnection.connector:
return ALL_SUPPORTED_CHAIN_IDS.includes(chainId)
default:
return false
}
}
export const switchChain = async (connector: Connector, chainId: SupportedChainId) => {
if (!isChainAllowed(connector, chainId)) {
throw new Error(`Chain ${chainId} not supported for connector (${typeof connector})`)
} else if (connector === walletConnectConnection.connector || connector === networkConnection.connector) {
await connector.activate(chainId)
} else {
const info = getChainInfo(chainId)
const addChainParameter = {
chainId,
chainName: info.label,
rpcUrls: getRpcUrls(chainId),
nativeCurrency: info.nativeCurrency,
blockExplorerUrls: [info.explorer],
}
await connector.activate(addChainParameter)
}
}