From c5411c45eb403fde9c41ca65ecf409d3f12049b8 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 9 Jun 2025 12:45:43 +0300 Subject: [PATCH 1/4] fix: deletes expirer entry after proposal response --- packages/sign-client/src/controllers/engine.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/sign-client/src/controllers/engine.ts b/packages/sign-client/src/controllers/engine.ts index 4d772f0dd..25bf6a173 100644 --- a/packages/sign-client/src/controllers/engine.ts +++ b/packages/sign-client/src/controllers/engine.ts @@ -481,6 +481,7 @@ export class Engine extends IEngine { metadata: proposer.metadata, }); await this.client.proposal.delete(id, getSdkError("USER_DISCONNECTED")); + this.client.core.expirer.del(id); await this.client.core.pairing.activate({ topic: pairingTopic }); await this.setExpiry(sessionTopic, calcExpiry(SESSION_EXPIRY)); return { @@ -515,8 +516,10 @@ export class Engine extends IEngine { error: reason, rpcOpts: ENGINE_RPC_OPTS.wc_sessionPropose.reject, }); - await this.client.proposal.delete(id, getSdkError("USER_DISCONNECTED")); } + + await this.client.proposal.delete(id, getSdkError("USER_DISCONNECTED")); + this.client.core.expirer.del(id); }; public update: IEngine["update"] = async (params) => { From d0413d0889292256d4884e8bff7d183c3f85311a Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 9 Jun 2025 12:45:55 +0300 Subject: [PATCH 2/4] feat: tests --- packages/sign-client/test/sdk/client.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/sign-client/test/sdk/client.spec.ts b/packages/sign-client/test/sdk/client.spec.ts index ff10c90d1..b6fd3c374 100644 --- a/packages/sign-client/test/sdk/client.spec.ts +++ b/packages/sign-client/test/sdk/client.spec.ts @@ -93,6 +93,10 @@ describe("Sign Client Integration", () => { expect(clients.B.metadata.redirect).to.exist; expect(clients.B.metadata.redirect?.native).to.exist; expect(clients.B.metadata.redirect?.universal).to.exist; + expect(clients.A.core.expirer.keys).to.deep.equal(clients.B.core.expirer.keys); + expect(clients.A.core.expirer.keys.length).to.eq(2); + expect(clients.B.core.expirer.keys.length).to.eq(2); + await deleteClients(clients); }); it("should set scopedProperties in session", async () => { From 8b6e3c0d187e2f47876bb81d7094fc7794b90e4e Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Mon, 9 Jun 2025 12:46:36 +0300 Subject: [PATCH 3/4] chore: changeset --- .changeset/plain-paws-happen.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .changeset/plain-paws-happen.md diff --git a/.changeset/plain-paws-happen.md b/.changeset/plain-paws-happen.md new file mode 100644 index 000000000..700c2f3fb --- /dev/null +++ b/.changeset/plain-paws-happen.md @@ -0,0 +1,12 @@ +--- +"@walletconnect/sign-client": patch +"@walletconnect/core": patch +"@walletconnect/react-native-compat": patch +"@walletconnect/types": patch +"@walletconnect/utils": patch +"@walletconnect/ethereum-provider": patch +"@walletconnect/signer-connection": patch +"@walletconnect/universal-provider": patch +--- + +deletes expirer entry after the wallet responds to a session proposal From b0ac30477f33906e0788ec500927439d94b3ef3b Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Wed, 11 Jun 2025 10:47:20 +0300 Subject: [PATCH 4/4] refactor: uses `deleteProposal` to delete a proposal --- packages/sign-client/src/controllers/engine.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/sign-client/src/controllers/engine.ts b/packages/sign-client/src/controllers/engine.ts index 25bf6a173..50549ced4 100644 --- a/packages/sign-client/src/controllers/engine.ts +++ b/packages/sign-client/src/controllers/engine.ts @@ -480,8 +480,7 @@ export class Engine extends IEngine { topic: pairingTopic, metadata: proposer.metadata, }); - await this.client.proposal.delete(id, getSdkError("USER_DISCONNECTED")); - this.client.core.expirer.del(id); + await this.deleteProposal(id); await this.client.core.pairing.activate({ topic: pairingTopic }); await this.setExpiry(sessionTopic, calcExpiry(SESSION_EXPIRY)); return { @@ -518,8 +517,7 @@ export class Engine extends IEngine { }); } - await this.client.proposal.delete(id, getSdkError("USER_DISCONNECTED")); - this.client.core.expirer.del(id); + await this.deleteProposal(id); }; public update: IEngine["update"] = async (params) => { @@ -1329,7 +1327,7 @@ export class Engine extends IEngine { ), }); await this.client.auth.requests.delete(id, { message: "rejected", code: 0 }); - await this.client.proposal.delete(id, getSdkError("USER_DISCONNECTED")); + await this.deleteProposal(id); }; public formatAuthMessage: IEngine["formatAuthMessage"] = (params) => { @@ -1956,7 +1954,7 @@ export class Engine extends IEngine { }); await this.client.core.pairing.activate({ topic }); } else if (isJsonRpcError(payload)) { - await this.client.proposal.delete(id, getSdkError("USER_DISCONNECTED")); + await this.deleteProposal(id); const target = engineEvent("session_connect", id); const listeners = this.events.listenerCount(target); if (listeners === 0) {