From 6712b98631112edb605081586091cbee21900c36 Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Fri, 5 Apr 2024 10:02:43 +0300 Subject: [PATCH 1/2] fix: cleans up fallback listener only on success response from `session_authenticate` --- packages/sign-client/src/controllers/engine.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/sign-client/src/controllers/engine.ts b/packages/sign-client/src/controllers/engine.ts index 793005043..66cc5fc4d 100644 --- a/packages/sign-client/src/controllers/engine.ts +++ b/packages/sign-client/src/controllers/engine.ts @@ -710,8 +710,6 @@ export class Engine extends IEngine { }; // handle session authenticate response const onAuthenticate = async (payload: any) => { - // remove cleanup for fallback response - this.events.off(engineEvent("session_connect"), onSessionConnect); if (payload.error) { // wallets that do not support wc_sessionAuthenticate will return an error // we should not reject the promise in this case as the fallback session proposal will be used @@ -719,6 +717,10 @@ export class Engine extends IEngine { if (payload.error.code === error.code) return; return reject(payload.error.message); } + + // cleanup listener for fallback response + this.events.off(engineEvent("session_connect"), onSessionConnect); + const { cacaos, responder, From 0c0aceade3c63bc2d7a9d36ad41b08421fcb46fa Mon Sep 17 00:00:00 2001 From: Gancho Radkov Date: Fri, 5 Apr 2024 10:32:55 +0300 Subject: [PATCH 2/2] feat: tests --- packages/sign-client/src/controllers/engine.ts | 3 +++ packages/sign-client/test/sdk/auth.spec.ts | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/sign-client/src/controllers/engine.ts b/packages/sign-client/src/controllers/engine.ts index 66cc5fc4d..541363b1d 100644 --- a/packages/sign-client/src/controllers/engine.ts +++ b/packages/sign-client/src/controllers/engine.ts @@ -715,6 +715,9 @@ export class Engine extends IEngine { // we should not reject the promise in this case as the fallback session proposal will be used const error = getSdkError("WC_METHOD_UNSUPPORTED", "wc_sessionAuthenticate"); if (payload.error.code === error.code) return; + + // cleanup listener for fallback response + this.events.off(engineEvent("session_connect"), onSessionConnect); return reject(payload.error.message); } diff --git a/packages/sign-client/test/sdk/auth.spec.ts b/packages/sign-client/test/sdk/auth.spec.ts index 8d8725258..6822b02a1 100644 --- a/packages/sign-client/test/sdk/auth.spec.ts +++ b/packages/sign-client/test/sdk/auth.spec.ts @@ -1124,6 +1124,15 @@ describe("Authenticated Sessions", () => { metadata: TEST_APP_METADATA_B, }); + // force wallet to not support `wc_sessionAuthenticate` by removing it from registered methods + const supportedMethods = ENGINE_RPC_OPTS; + const toRegisterMethods = Object.keys(supportedMethods).filter( + (method) => method !== "wc_sessionAuthenticate", + ); + //@ts-expect-error + wallet.core.pairing.registeredMethods = []; + wallet.core.pairing.register({ methods: toRegisterMethods }); + await Promise.all([ new Promise((resolve) => { wallet.on("session_proposal", async (payload) => { @@ -1151,7 +1160,7 @@ describe("Authenticated Sessions", () => { }); }), new Promise((resolve) => { - wallet.pair({ uri: uri.replace("methods", "") }); + wallet.pair({ uri }); resolve(); }), ]);