839d4ac8e2
* replaced CHAIN_INFO access with a function call * updated CTACard tests to work with getChainInfo * updated typechecking, removed console.log
76 lines
2.6 KiB
TypeScript
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)
|
|
}
|
|
}
|