@@ -25,16 +25,12 @@ export interface BaseProviderConfig extends BaseConfig {
2525 keyExportEnabled ?: boolean ;
2626}
2727
28- export interface CommonProviderEvents extends ProviderEvents {
29- chainChanged : ( chainId : string ) => void ;
30- }
31-
3228export abstract class BaseProvider < C extends BaseProviderConfig , S extends BaseProviderState , P >
3329 extends BaseController < C , S , BaseProviderEvents < S > >
3430 implements IBaseProvider < P >
3531{
3632 // should be Assigned in setupProvider
37- public _providerEngineProxy : SafeEventEmitterProvider < CommonProviderEvents > | null = null ;
33+ public _providerEngineProxy : SafeEventEmitterProvider < ProviderEvents > | null = null ;
3834
3935 // set to true when the keyExportEnabled flag is set by code.
4036 // This is to prevent the flag from being overridden by the dashboard config.
@@ -62,7 +58,7 @@ export abstract class BaseProvider<C extends BaseProviderConfig, S extends BaseP
6258 return this . config . chains . find ( ( chain ) => chain . chainId === this . state . chainId ) ;
6359 }
6460
65- get provider ( ) : SafeEventEmitterProvider < CommonProviderEvents > | null {
61+ get provider ( ) : SafeEventEmitterProvider < ProviderEvents > | null {
6662 return this . _providerEngineProxy ;
6763 }
6864
@@ -121,23 +117,17 @@ export abstract class BaseProvider<C extends BaseProviderConfig, S extends BaseP
121117 ( this . _providerEngineProxy as any ) . setTarget ( provider ) ;
122118
123119 // we want events to propagate from Ethereum provider -> wrapper provider (e.g. CommonJRPC provider) -> SDK -> dapp
124- // override emit method to capture and re-emit events
125- const originalEmit = provider . emit . bind ( provider ) ;
126- provider . emit = ( ...args ) => {
127- const result = originalEmit ( ...args ) ;
128-
129- // handle chainChanged event: update chainId state
130- const event = args [ 0 ] as string ;
131- if ( event === EIP1193_EVENTS . CHAIN_CHANGED ) {
132- const chainId = args [ 1 ] as string ;
133- this . update ( { chainId } as Partial < S > ) ;
134- }
135-
136- // re-emit event
137- // eslint-disable-next-line
138- this . emit ( event as keyof BaseProviderEvents < S > , ...( args . slice ( 1 ) as any ) ) ;
139- return result ;
140- } ;
120+ // when a listener is added to the wrapper provider, listen to the same event from the Ethereum provider and re-emit it
121+ this . once ( "newListener" , ( event , _listener ) => {
122+ provider . on ( event as keyof ProviderEvents , ( ...args ) => {
123+ // handle chainChanged event: update chainId state
124+ if ( event === EIP1193_EVENTS . CHAIN_CHANGED ) {
125+ const chainId = args [ 0 ] as string ;
126+ this . update ( { chainId } as Partial < S > ) ;
127+ }
128+ this . emit ( event as keyof BaseProviderEvents < S > , ...( args as never ) ) ;
129+ } ) ;
130+ } ) ;
141131 } else {
142132 this . _providerEngineProxy = createEventEmitterProxy < SafeEventEmitterProvider > ( provider ) ;
143133 }
0 commit comments