@@ -141,14 +141,33 @@ export function createModernProviderInterface(provider: any): WalletInterface {
141
141
142
142
const onFuncExists = typeof provider . on === 'function'
143
143
144
+ interface ProviderEventHandlers {
145
+ accountsChanged : ( ( arg : string [ ] ) => void ) | null
146
+ networkChanged : ( ( arg : string | number ) => void ) | null
147
+ chainChanged : ( ( arg : string | number ) => void ) | null
148
+ }
149
+
150
+ // A map of provider event handlers -- refferences needed
151
+ // in order to remove the event listners when their no longer needed
152
+ const providerEventHandler : ProviderEventHandlers = {
153
+ accountsChanged : null ,
154
+ networkChanged : null ,
155
+ chainChanged : null
156
+ }
157
+
144
158
return {
145
159
address : onFuncExists
146
160
? {
147
161
onChange : func => {
162
+ providerEventHandler [ 'accountsChanged' ] = ( accounts : string [ ] ) => {
163
+ func ( accounts && accounts [ 0 ] )
164
+ }
165
+
148
166
// get the initial value
149
167
getAddress ( provider ) . then ( func )
150
- provider . on ( 'accountsChanged' , ( accounts : string [ ] ) =>
151
- func ( accounts && accounts [ 0 ] )
168
+ provider . on (
169
+ 'accountsChanged' ,
170
+ providerEventHandler [ 'accountsChanged' ]
152
171
)
153
172
}
154
173
}
@@ -158,18 +177,26 @@ export function createModernProviderInterface(provider: any): WalletInterface {
158
177
network : onFuncExists
159
178
? {
160
179
onChange : ( func : ( val : string | number ) => void ) => {
180
+ providerEventHandler [ 'networkChanged' ] = ( netId : string | number ) =>
181
+ func ( netId && Number ( netId ) )
182
+
183
+ // We clone the previous handler in order to get a distinct refference
184
+ // to the 'chainChanged' event handler
185
+ providerEventHandler [ 'chainChanged' ] = providerEventHandler [
186
+ 'networkChanged'
187
+ ] . bind ( { } )
188
+
161
189
// get initial value
162
190
getNetwork ( provider ) . then ( func )
163
191
164
192
// networkChanged event is deprecated in MM, keep for wallets that may not have updated
165
- provider . on ( 'networkChanged' , ( netId : string | number ) =>
166
- func ( netId && Number ( netId ) )
193
+ provider . on (
194
+ 'networkChanged' ,
195
+ providerEventHandler [ 'networkChanged' ]
167
196
)
168
197
169
198
// use new chainChanged event for network change
170
- provider . on ( 'chainChanged' , ( netId : string | number ) =>
171
- func ( netId && Number ( netId ) )
172
- )
199
+ provider . on ( 'chainChanged' , providerEventHandler [ 'chainChanged' ] )
173
200
}
174
201
}
175
202
: { get : ( ) => getNetwork ( provider ) } ,
@@ -193,6 +220,17 @@ export function createModernProviderInterface(provider: any): WalletInterface {
193
220
}
194
221
}
195
222
} ,
223
+ disconnect : ( ) => {
224
+ if ( provider ?. removeListener ) {
225
+ // Iterate over the event handlers and remove them from the event listener.
226
+ for ( const [ key , handler ] of Object . entries ( providerEventHandler ) ) {
227
+ // If the handler is null, this indicates that no event listener was created
228
+ if ( handler ) {
229
+ provider . removeListener ( key , handler )
230
+ }
231
+ }
232
+ }
233
+ } ,
196
234
name : getProviderName ( provider )
197
235
}
198
236
}
0 commit comments