diff --git a/packages/web3wallet/src/controllers/engine.ts b/packages/web3wallet/src/controllers/engine.ts index 2feff9a43..85d94e4e0 100644 --- a/packages/web3wallet/src/controllers/engine.ts +++ b/packages/web3wallet/src/controllers/engine.ts @@ -124,11 +124,13 @@ export class Engine extends IWeb3WalletEngine { // ---------- public events ----------------------------------------------- // public on: IWeb3WalletEngine["on"] = (name, listener) => { + this.setEvent(name, "off"); this.setEvent(name, "on"); return this.client.events.on(name, listener); }; public once: IWeb3WalletEngine["once"] = (name, listener) => { + this.setEvent(name, "off"); this.setEvent(name, "once"); return this.client.events.once(name, listener); }; diff --git a/packages/web3wallet/test/sign.spec.ts b/packages/web3wallet/test/sign.spec.ts index 892c02494..ab1b82660 100644 --- a/packages/web3wallet/test/sign.spec.ts +++ b/packages/web3wallet/test/sign.spec.ts @@ -10,7 +10,7 @@ import { buildApprovedNamespaces, buildAuthObject, getSdkError } from "@walletco import { toMiliseconds } from "@walletconnect/time"; import { Wallet as CryptoWallet } from "@ethersproject/wallet"; -import { expect, describe, it, beforeEach, vi, beforeAll, afterAll, afterEach } from "vitest"; +import { expect, describe, it, beforeEach, vi, beforeAll, afterEach, fn } from "vitest"; import { Web3Wallet, IWeb3Wallet } from "../src"; import { disconnect, @@ -464,6 +464,25 @@ describe("Sign Integration", () => { expect(Object.keys(sessions)[0]).to.be.eq(session.topic); }); + it("should handle multiple session proposal listeners correctly", async () => { + const firstHandler = vi.fn(); + const secondHandler = vi.fn(); + + await Promise.all([ + new Promise((resolve) => { + wallet.on("session_proposal", firstHandler); + wallet.on("session_proposal", secondHandler); + wallet.on("session_proposal", () => { + resolve(); + }); + }), + wallet.pair({ uri: uriString }), + ]); + + expect(firstHandler.mock.calls).toHaveLength(1); + expect(secondHandler.mock.calls).toHaveLength(1); + }); + it("should get pending session proposals", async () => { // first pair and approve session await Promise.all([