From 52fa86e354e0217d4007b9eb54a88a4d60147705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Strn=C3=A1dek?= Date: Thu, 12 Oct 2023 10:19:44 +0200 Subject: [PATCH] feat: Add sign message support (#958) * feat(my-near-wallet): Add sign message support * Fixes after review --- .../src/lib/my-near-wallet.spec.ts | 28 +++++++++++++++++++ .../my-near-wallet/src/lib/my-near-wallet.ts | 27 ++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/packages/my-near-wallet/src/lib/my-near-wallet.spec.ts b/packages/my-near-wallet/src/lib/my-near-wallet.spec.ts index 1cee4c83e..94b32b37b 100644 --- a/packages/my-near-wallet/src/lib/my-near-wallet.spec.ts +++ b/packages/my-near-wallet/src/lib/my-near-wallet.spec.ts @@ -132,3 +132,31 @@ describe("buildImportAccountsUrl", () => { ); }); }); + +describe("signMessage", () => { + it("sign message", async () => { + const { wallet } = await createMyNearWallet(); + + const replace = window.location.replace; + + Object.defineProperty(window, "location", { + value: { replace: jest.fn() }, + }); + + const attributes = { + message: "test message", + nonce: Buffer.from("30990309-30990309-390A303-292090"), + recipient: "test.app", + callbackUrl: "https://test.app", + }; + + const result = await wallet.signMessage!(attributes); + + expect(result).toBe(undefined); + expect(window.location.replace).toHaveBeenCalledWith( + "https://testnet.mynearwallet.com/sign-message?message=test+message&nonce=30990309-30990309-390A303-292090&recipient=test.app&callbackUrl=https%3A%2F%2Ftest.app" + ); + + window.location.replace = replace; + }); +}); diff --git a/packages/my-near-wallet/src/lib/my-near-wallet.ts b/packages/my-near-wallet/src/lib/my-near-wallet.ts index d9e6ca35a..4095d4a1c 100644 --- a/packages/my-near-wallet/src/lib/my-near-wallet.ts +++ b/packages/my-near-wallet/src/lib/my-near-wallet.ts @@ -160,6 +160,33 @@ const MyNearWallet: WalletBehaviourFactory< throw new Error(`Method not supported by ${metadata.name}`); }, + async signMessage({ message, nonce, recipient, callbackUrl, state }) { + logger.log("sign message", { message }); + + const locationUrl = + typeof window !== "undefined" ? window.location.href : ""; + + const url = callbackUrl || locationUrl; + + if (!url) { + throw new Error(`The callbackUrl is missing for ${metadata.name}`); + } + + const href = new URL(params.walletUrl); + href.pathname = "sign-message"; + href.searchParams.append("message", message); + href.searchParams.append("nonce", nonce.toString()); + href.searchParams.append("recipient", recipient); + href.searchParams.append("callbackUrl", url); + if (state) { + href.searchParams.append("state", state); + } + + window.location.replace(href.toString()); + + return; + }, + async signAndSendTransaction({ signerId, receiverId,