-
Notifications
You must be signed in to change notification settings - Fork 145
/
connections.ts
96 lines (85 loc) · 2.59 KB
/
connections.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import { Web3ReactHooks } from '@web3-react/core'
import { Connector, AddEthereumChainParameter } from '@web3-react/types'
import { buildInjectedConnector } from './injected'
import { buildNetworkConnector } from './network'
import { buildCoinbaseWalletConnector } from './coinbase'
import { buildGnosisSafeConnector } from './gnosis'
import { buildWalletConnectConnector } from './wallet-connect'
import { CHAIN_INFO } from './constants'
export interface Connection {
connector: Connector
hooks: Web3ReactHooks
type: ConnectionType
}
export enum ConnectionType {
COINBASE_WALLET = 'COINBASE_WALLET',
GNOSIS_SAFE = 'GNOSIS_SAFE',
INJECTED = 'INJECTED',
NETWORK = 'NETWORK',
WALLET_CONNECT = 'WALLET_CONNECT',
}
export function getIsInjected(): boolean {
return Boolean(window.ethereum)
}
export function getHasMetaMaskExtensionInstalled(): boolean {
return window.ethereum?.isMetaMask ?? false
}
export function onConnectionError(error: Error) {
console.debug(`web3-react error: ${error}`)
}
export const PRIORITIZED_CONNECTORS: Connection[] = [
buildInjectedConnector(),
buildCoinbaseWalletConnector(),
buildWalletConnectConnector(),
buildGnosisSafeConnector(),
buildNetworkConnector(),
]
export function getConnection(c: Connector | ConnectionType) {
if (c instanceof Connector) {
const connection = PRIORITIZED_CONNECTORS.find(
(connection) => connection.connector === c
)
if (!connection) {
throw Error('unsupported connector')
}
return connection
} else {
switch (c) {
case ConnectionType.INJECTED:
return PRIORITIZED_CONNECTORS[0]
case ConnectionType.COINBASE_WALLET:
return PRIORITIZED_CONNECTORS[1]
case ConnectionType.WALLET_CONNECT:
return PRIORITIZED_CONNECTORS[2]
case ConnectionType.GNOSIS_SAFE:
return PRIORITIZED_CONNECTORS[3]
case ConnectionType.NETWORK:
return PRIORITIZED_CONNECTORS[4]
}
}
}
export const switchNetwork = async (
chainId: number,
connectionType: ConnectionType | null
) => {
if (!connectionType) {
return
}
const { connector } = getConnection(connectionType)
if (
connectionType === ConnectionType.WALLET_CONNECT ||
connectionType === ConnectionType.NETWORK
) {
await connector.activate(chainId)
return
}
const chainInfo = CHAIN_INFO[chainId]
const addChainParameter: AddEthereumChainParameter = {
chainId,
chainName: chainInfo.label,
rpcUrls: [chainInfo.rpcUrl],
nativeCurrency: chainInfo.nativeCurrency,
blockExplorerUrls: [chainInfo.explorer],
}
await connector.activate(addChainParameter)
}