Skip to content

Commit ca64ba8

Browse files
committed
watch listeners on base provider and subscribe to same event on eth provider
1 parent 0a615ef commit ca64ba8

File tree

2 files changed

+17
-24
lines changed

2 files changed

+17
-24
lines changed

packages/no-modal/src/providers/base-provider/baseProvider.ts

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
3228
export 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
}

packages/no-modal/src/providers/base-provider/interfaces.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@ import { BaseControllerEvents } from "@toruslabs/base-controllers";
22

33
import { ProviderEvents } from "@/core/base";
44

5-
export type BaseProviderEvents<S> = ProviderEvents & BaseControllerEvents<S>;
5+
export type BaseProviderEvents<S> = ProviderEvents &
6+
BaseControllerEvents<S> & {
7+
newListener: (event: string, listener: (...args: unknown[]) => void) => void;
8+
};

0 commit comments

Comments
 (0)