@@ -16,7 +16,9 @@ export interface Web3ContextType {
16
16
network : number ;
17
17
}
18
18
19
- export const Web3Context = React . createContext < Web3ContextType | undefined > ( undefined ) ;
19
+ export const Web3Context = React . createContext < Web3ContextType | undefined > (
20
+ undefined
21
+ ) ;
20
22
21
23
export interface ProviderProps {
22
24
/**
@@ -55,16 +57,18 @@ export const Provider: React.FC<ProviderProps> = ({
55
57
children,
56
58
network,
57
59
infuraId,
58
- extraWalletProviders = [ ] ,
60
+ extraWalletProviders = [ ]
59
61
} ) => {
60
62
const [ signer , setSigner ] = React . useState < null | JsonRpcSigner > ( ) ;
61
- const [ provider , setProvider ] = React . useState < ethers . providers . Web3Provider | null > ( ) ;
63
+ const [
64
+ provider ,
65
+ setProvider
66
+ ] = React . useState < ethers . providers . Web3Provider | null > ( ) ;
62
67
const [ userAddress , setUserAddress ] = React . useState < null | string > ( ) ;
63
68
const [ web3Modal , setWeb3Modal ] = React . useState < Web3Modal > ( ) ;
64
69
const [ chainId , setChainId ] = React . useState < number | null > ( ) ;
65
70
const [ connected , setConnected ] = React . useState < boolean > ( false ) ;
66
71
const [ correctNetwork , setCorrectNetwork ] = React . useState < boolean > ( true ) ;
67
- const [ connection , setConnection ] = React . useState < any > ( ) ;
68
72
69
73
const connectWallet = React . useCallback ( async ( ) => {
70
74
const defaulProviderOptions = {
@@ -76,71 +80,78 @@ export const Provider: React.FC<ProviderProps> = ({
76
80
rpc : {
77
81
1 : `https://eth-mainnet.alchemyapi.io/v2/${ infuraId } ` , // mainnet // For more WalletConnect providers: https://docs.walletconnect.org/quick-start/dapps/web3-provider#required
78
82
42 : `https://kovan.infura.io/v3/${ infuraId } ` ,
79
- 100 : 'https://dai.poa.network' , // xDai
80
- } ,
81
- } ,
82
- } ,
83
+ 100 : 'https://dai.poa.network' // xDai
84
+ }
85
+ }
86
+ }
83
87
} ;
84
88
85
89
const web3Modal = new Web3Modal ( {
86
- providerOptions : Object . assign ( defaulProviderOptions , ...extraWalletProviders ) ,
90
+ providerOptions : Object . assign (
91
+ defaulProviderOptions ,
92
+ ...extraWalletProviders
93
+ )
87
94
} ) ;
88
95
setWeb3Modal ( web3Modal ) ;
89
96
const connection = await web3Modal . connect ( ) ;
90
- setConnection ( connection ) ;
91
97
const provider = new ethers . providers . Web3Provider ( connection ) ;
92
98
setProvider ( provider ) ;
93
- const chainId = await provider . getNetwork ( ) . then ( network => network . chainId ) ;
99
+ const chainId = await provider
100
+ . getNetwork ( )
101
+ . then ( network => network . chainId ) ;
94
102
setChainId ( chainId ) ;
95
103
setCorrectNetwork ( chainId === network ) ;
96
104
const signer = provider . getSigner ( ) ;
97
105
setSigner ( signer ) ;
98
106
setUserAddress ( await signer . getAddress ( ) ) ;
99
107
setConnected ( true ) ;
100
108
101
- connection . on ( 'chainChanged' , onNetworkChange ) ;
102
- connection . on ( 'accountsChanged' , onAccountsChanged ) ;
103
- connection . on ( 'disconnect' , onDisconnect ) ;
109
+ connection . on ( 'chainChanged' , async ( newChainId : string ) => {
110
+ const formattedChainId = + newChainId . split ( '0x' ) [ 1 ] ;
111
+ setChainId ( formattedChainId ) ;
112
+ setCorrectNetwork ( formattedChainId === network ) ;
113
+ const provider = new ethers . providers . Web3Provider ( connection ) ;
114
+ setProvider ( provider ) ;
115
+ const signer = provider . getSigner ( ) ;
116
+ setSigner ( signer ) ;
117
+ setUserAddress ( await signer . getAddress ( ) ) ;
118
+ setConnected ( true ) ;
119
+ } ) ;
120
+
121
+ connection . on ( 'accountsChanged' , async ( accounts : string [ ] ) => {
122
+ if ( accounts . length === 0 ) {
123
+ // The user has disconnected their account from Metamask
124
+ web3Modal ?. clearCachedProvider ( ) ;
125
+ disconnectWallet ( ) ;
126
+ return ;
127
+ }
128
+ const provider = new ethers . providers . Web3Provider ( connection ) ;
129
+ setProvider ( provider ) ;
130
+ const chainId = await provider
131
+ . getNetwork ( )
132
+ . then ( network => network . chainId ) ;
133
+ setChainId ( chainId ) ;
134
+ setCorrectNetwork ( chainId === network ) ;
135
+ const signer = provider . getSigner ( ) ;
136
+ setSigner ( signer ) ;
137
+ setUserAddress ( await signer . getAddress ( ) ) ;
138
+ setConnected ( true ) ;
139
+ } ) ;
140
+
141
+ connection . on ( 'disconnect' , async ( ) => {
142
+ web3Modal ?. clearCachedProvider ( ) ;
143
+ disconnectWallet ( ) ;
144
+ } ) ;
104
145
} , [
105
146
Web3Modal ,
106
147
web3Modal ,
107
148
WalletConnectProvider ,
108
149
network ,
109
150
infuraId ,
110
151
ethers ,
111
- correctNetwork ,
112
- connection ,
152
+ correctNetwork
113
153
] ) ;
114
154
115
- const onNetworkChange = async ( newChainId : string ) => {
116
- const formattedChainId = + newChainId . split ( '0x' ) [ 1 ] ;
117
- setChainId ( formattedChainId ) ;
118
- setCorrectNetwork ( formattedChainId === network ) ;
119
- const provider = new ethers . providers . Web3Provider ( connection ) ;
120
- setProvider ( provider ) ;
121
- const signer = provider . getSigner ( ) ;
122
- setSigner ( signer ) ;
123
- setUserAddress ( await signer . getAddress ( ) ) ;
124
- setConnected ( true ) ;
125
- } ;
126
-
127
- const onAccountsChanged = async ( ) => {
128
- const provider = new ethers . providers . Web3Provider ( connection ) ;
129
- setProvider ( provider ) ;
130
- const chainId = await provider . getNetwork ( ) . then ( network => network . chainId ) ;
131
- setChainId ( chainId ) ;
132
- setCorrectNetwork ( chainId === network ) ;
133
- const signer = provider . getSigner ( ) ;
134
- setSigner ( signer ) ;
135
- setUserAddress ( await signer . getAddress ( ) ) ;
136
- setConnected ( true ) ;
137
- } ;
138
-
139
- const onDisconnect = async ( ) => {
140
- web3Modal ?. clearCachedProvider ( ) ;
141
- disconnectWallet ( ) ;
142
- } ;
143
-
144
155
const disconnectWallet = React . useCallback ( ( ) => {
145
156
web3Modal ?. clearCachedProvider ( ) ;
146
157
setSigner ( null ) ;
@@ -158,7 +169,7 @@ export const Provider: React.FC<ProviderProps> = ({
158
169
provider,
159
170
network,
160
171
chainId,
161
- correctNetwork,
172
+ correctNetwork
162
173
} ) ,
163
174
[
164
175
connectWallet ,
@@ -169,9 +180,11 @@ export const Provider: React.FC<ProviderProps> = ({
169
180
provider ,
170
181
network ,
171
182
chainId ,
172
- correctNetwork ,
183
+ correctNetwork
173
184
]
174
185
) ;
175
186
176
- return < Web3Context . Provider value = { { ...value } } > { children } </ Web3Context . Provider > ;
187
+ return (
188
+ < Web3Context . Provider value = { { ...value } } > { children } </ Web3Context . Provider >
189
+ ) ;
177
190
} ;
0 commit comments