Skip to content

Commit 8c564b4

Browse files
authored
Merge pull request #5731 from NomicFoundation/fix-event-forwarding-explicit-init
Fix provider events when init is called
2 parents ee8d62b + dfb232e commit 8c564b4

File tree

3 files changed

+33
-14
lines changed

3 files changed

+33
-14
lines changed

.changeset/chilled-sheep-buy.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"hardhat": patch
3+
---
4+
5+
Fixed a problem with provider events when `provider.init` was explicitly called before the first request.

packages/hardhat-core/src/internal/core/providers/lazy-initialization.ts

+13-13
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,19 @@ export class LazyInitializationProviderAdapter implements EthereumProvider {
4040
this._initializingPromise = this._providerFactory();
4141
}
4242
this.provider = await this._initializingPromise;
43+
44+
// Copy any event emitter events before initialization over to the provider
45+
const recordedEvents = this._emitter.eventNames();
46+
47+
this.provider.setMaxListeners(this._emitter.getMaxListeners());
48+
49+
for (const event of recordedEvents) {
50+
const listeners = this._emitter.rawListeners(event) as Listener[];
51+
for (const listener of listeners) {
52+
this.provider.on(event, listener);
53+
this._emitter.removeListener(event, listener);
54+
}
55+
}
4356
}
4457
return this.provider;
4558
}
@@ -158,19 +171,6 @@ export class LazyInitializationProviderAdapter implements EthereumProvider {
158171

159172
if (this.provider === undefined) {
160173
this.provider = await this.init();
161-
162-
// Copy any event emitter events before initialization over to the provider
163-
const recordedEvents = this._emitter.eventNames();
164-
165-
for (const event of recordedEvents) {
166-
const listeners = this._emitter.rawListeners(event) as Listener[];
167-
for (const listener of listeners) {
168-
this.provider.on(event, listener);
169-
this._emitter.removeListener(event, listener);
170-
}
171-
}
172-
173-
this.provider.setMaxListeners(this._emitter.getMaxListeners());
174174
}
175175

176176
return this.provider;

packages/hardhat-core/test/internal/core/providers/lazy-initialization.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ describe("LazyInitializationProviderAdapter", () => {
9797
assert.equal(callTimes, 3);
9898
});
9999

100-
it("should move the registered events to the provider after initialization", async () => {
100+
it("should move the registered events to the provider after implicit initialization", async () => {
101101
provider.on("event", eventHandler);
102102
provider.on("otherevent", eventHandler);
103103
provider.once("onceevent", eventHandler);
@@ -110,6 +110,20 @@ describe("LazyInitializationProviderAdapter", () => {
110110

111111
assert.deepEqual(callTimes, 3);
112112
});
113+
114+
it("should move the registered events to the provider after explicit initialization", async () => {
115+
provider.on("event", eventHandler);
116+
provider.on("otherevent", eventHandler);
117+
provider.once("onceevent", eventHandler);
118+
119+
await provider.init();
120+
provider.emit("event"); // 1
121+
provider.emit("otherevent"); // 2
122+
provider.emit("onceevent"); // 3
123+
provider.emit("onceevent"); // 3
124+
125+
assert.deepEqual(callTimes, 3);
126+
});
113127
});
114128

115129
describe("request", () => {

0 commit comments

Comments
 (0)