From 6ffd194f9b41446a639b5c26d0e9b0a81597658f Mon Sep 17 00:00:00 2001 From: Luka Isailovic Date: Mon, 10 Jun 2024 11:59:16 +0200 Subject: [PATCH 1/7] fix: remove required status fro metadata field --- packages/types/src/sign-client/client.ts | 2 +- providers/ethereum-provider/src/EthereumProvider.ts | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/types/src/sign-client/client.ts b/packages/types/src/sign-client/client.ts index d278a81e9..4d85179eb 100644 --- a/packages/types/src/sign-client/client.ts +++ b/packages/types/src/sign-client/client.ts @@ -66,7 +66,7 @@ export declare namespace SignClientTypes { interface Options extends CoreTypes.Options { core?: ICore; - metadata: Metadata; + metadata?: Metadata; signConfig?: SignConfig; } } diff --git a/providers/ethereum-provider/src/EthereumProvider.ts b/providers/ethereum-provider/src/EthereumProvider.ts index e2d0c213b..5aae00de0 100644 --- a/providers/ethereum-provider/src/EthereumProvider.ts +++ b/providers/ethereum-provider/src/EthereumProvider.ts @@ -68,7 +68,7 @@ export interface EthereumRpcConfig { optionalEvents?: string[]; rpcMap: EthereumRpcMap; projectId: string; - metadata: Metadata; + metadata?: Metadata; showQrModal: boolean; qrModalOptions?: QrModalOptions; } @@ -213,7 +213,7 @@ export type EthereumProviderOptions = { events?: string[]; optionalEvents?: string[]; rpcMap?: EthereumRpcMap; - metadata: Metadata; + metadata?: Metadata; showQrModal: boolean; qrModalOptions?: QrModalOptions; disableProviderPing?: boolean; @@ -558,13 +558,18 @@ export class EthereumProvider implements IEthereumProvider { } protected async initialize(opts: EthereumProviderOptions) { + const metadata = this.rpc.metadata; + if (metadata === undefined) { + throw new Error("Metadata field is required"); + } + this.rpc = this.getRpcConfig(opts); this.chainId = this.rpc.chains.length ? getEthereumChainId(this.rpc.chains) : getEthereumChainId(this.rpc.optionalChains); this.signer = await UniversalProvider.init({ projectId: this.rpc.projectId, - metadata: this.rpc.metadata, + metadata, disableProviderPing: opts.disableProviderPing, relayUrl: opts.relayUrl, storageOptions: opts.storageOptions, From 65a0712987de98b510a6bed590fec3b34f251fdc Mon Sep 17 00:00:00 2001 From: Luka Isailovic Date: Mon, 10 Jun 2024 11:59:28 +0200 Subject: [PATCH 2/7] chore: add test when metadata object is not provided --- packages/sign-client/test/sdk/client.spec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/sign-client/test/sdk/client.spec.ts b/packages/sign-client/test/sdk/client.spec.ts index 2da25f0d1..3141a808d 100644 --- a/packages/sign-client/test/sdk/client.spec.ts +++ b/packages/sign-client/test/sdk/client.spec.ts @@ -45,6 +45,19 @@ describe("Sign Client Integration", () => { await deleteClients({ A: client, B: undefined }); }); + it("should not initialize without metadata object", async () => { + const options = TEST_SIGN_CLIENT_OPTIONS; + delete options.metadata; + + await expect( + SignClient.init({ + ...options, + name: "init", + signConfig: { disableRequestQueue: true }, + }), + ).rejects.toThrowError("name is required value in metadata"); + }); + it("should not initialize with empty metadata", async () => { await expect( SignClient.init({ From 336a23784322de330f9fbc4896fa3b9e6c0333df Mon Sep 17 00:00:00 2001 From: Luka Isailovic Date: Mon, 10 Jun 2024 12:09:02 +0200 Subject: [PATCH 3/7] fix: tests --- providers/ethereum-provider/test/index.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/providers/ethereum-provider/test/index.spec.ts b/providers/ethereum-provider/test/index.spec.ts index c62beb906..9ad0d3790 100644 --- a/providers/ethereum-provider/test/index.spec.ts +++ b/providers/ethereum-provider/test/index.spec.ts @@ -564,6 +564,7 @@ describe("EthereumProvider", function () { chains: [], optionalChains: [], showQrModal: false, + metadata: TEST_WALLET_METADATA, }), ).rejects.toThrowError("No chains specified in either `chains` or `optionalChains`"); }); From 60a504fd6a650b1bbf6d39093b8d5b5531d502f6 Mon Sep 17 00:00:00 2001 From: Luka Isailovic Date: Mon, 10 Jun 2024 12:23:41 +0200 Subject: [PATCH 4/7] fix: get metadata from RPC --- providers/ethereum-provider/src/EthereumProvider.ts | 3 ++- providers/ethereum-provider/test/index.spec.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/providers/ethereum-provider/src/EthereumProvider.ts b/providers/ethereum-provider/src/EthereumProvider.ts index 5aae00de0..94f0b41db 100644 --- a/providers/ethereum-provider/src/EthereumProvider.ts +++ b/providers/ethereum-provider/src/EthereumProvider.ts @@ -558,12 +558,13 @@ export class EthereumProvider implements IEthereumProvider { } protected async initialize(opts: EthereumProviderOptions) { + this.rpc = this.getRpcConfig(opts); + const metadata = this.rpc.metadata; if (metadata === undefined) { throw new Error("Metadata field is required"); } - this.rpc = this.getRpcConfig(opts); this.chainId = this.rpc.chains.length ? getEthereumChainId(this.rpc.chains) : getEthereumChainId(this.rpc.optionalChains); diff --git a/providers/ethereum-provider/test/index.spec.ts b/providers/ethereum-provider/test/index.spec.ts index 9ad0d3790..62f9ee30b 100644 --- a/providers/ethereum-provider/test/index.spec.ts +++ b/providers/ethereum-provider/test/index.spec.ts @@ -1,3 +1,4 @@ +import { TEST_APP_METADATA_A } from "./../../../packages/sign-client/test/shared/values"; import { afterAll, beforeAll, describe, expect, it } from "vitest"; import Web3 from "web3"; import { BigNumber, providers, utils } from "ethers"; @@ -53,7 +54,7 @@ describe("EthereumProvider", function () { }, }, disableProviderPing: true, - metadata: TEST_WALLET_METADATA, + metadata: TEST_APP_METADATA_A, }); walletClient = await WalletClient.init(provider, TEST_WALLET_CLIENT_OPTS); await provider.connect({ From c9718aa18e83b2542d27efc94365ddb648179382 Mon Sep 17 00:00:00 2001 From: Luka Isailovic Date: Mon, 10 Jun 2024 12:46:10 +0200 Subject: [PATCH 5/7] chore: pass metadata explicity in sign-client tests --- packages/sign-client/test/sdk/client.spec.ts | 43 ++++++++++++++++---- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/packages/sign-client/test/sdk/client.spec.ts b/packages/sign-client/test/sdk/client.spec.ts index 3141a808d..2e9c519db 100644 --- a/packages/sign-client/test/sdk/client.spec.ts +++ b/packages/sign-client/test/sdk/client.spec.ts @@ -1,4 +1,9 @@ -import { TEST_EMPTY_METADATA, TEST_INVALID_METADATA } from "./../shared/values"; +import { TEST_WALLET_METADATA } from "./../../../../providers/universal-provider/test/shared/constants"; +import { + TEST_APP_METADATA_A, + TEST_EMPTY_METADATA, + TEST_INVALID_METADATA, +} from "./../shared/values"; import { formatJsonRpcError, formatJsonRpcResult, @@ -177,8 +182,16 @@ describe("Sign Client Integration", () => { await deleteClients(clients); }); it("should emit session_proposal on every pair attempt with same URI as long as the proposal has not yet been approved or rejected", async () => { - const dapp = await SignClient.init({ ...TEST_SIGN_CLIENT_OPTIONS, name: "dapp" }); - const wallet = await SignClient.init({ ...TEST_SIGN_CLIENT_OPTIONS, name: "wallet" }); + const dapp = await SignClient.init({ + ...TEST_SIGN_CLIENT_OPTIONS, + name: "dapp", + metadata: TEST_APP_METADATA_A, + }); + const wallet = await SignClient.init({ + ...TEST_SIGN_CLIENT_OPTIONS, + name: "wallet", + metadata: TEST_WALLET_METADATA, + }); const { uri, approval } = await dapp.connect(TEST_CONNECT_PARAMS); if (!uri) throw new Error("URI is undefined"); expect(uri).to.exist; @@ -224,8 +237,16 @@ describe("Sign Client Integration", () => { await deleteClients({ A: dapp, B: wallet }); }); it("should set `sessionConfig`", async () => { - const dapp = await SignClient.init({ ...TEST_SIGN_CLIENT_OPTIONS, name: "dapp" }); - const wallet = await SignClient.init({ ...TEST_SIGN_CLIENT_OPTIONS, name: "wallet" }); + const dapp = await SignClient.init({ + ...TEST_SIGN_CLIENT_OPTIONS, + name: "dapp", + metadata: TEST_APP_METADATA_A, + }); + const wallet = await SignClient.init({ + ...TEST_SIGN_CLIENT_OPTIONS, + name: "wallet", + metadata: TEST_WALLET_METADATA, + }); const { uri, approval } = await dapp.connect(TEST_CONNECT_PARAMS); if (!uri) throw new Error("URI is undefined"); expect(uri).to.exist; @@ -267,8 +288,16 @@ describe("Sign Client Integration", () => { await deleteClients({ A: dapp, B: wallet }); }); it("should use rejected tag for session_propose", async () => { - const dapp = await SignClient.init({ ...TEST_SIGN_CLIENT_OPTIONS, name: "dapp" }); - const wallet = await SignClient.init({ ...TEST_SIGN_CLIENT_OPTIONS, name: "wallet" }); + const dapp = await SignClient.init({ + ...TEST_SIGN_CLIENT_OPTIONS, + name: "dapp", + metadata: TEST_APP_METADATA_A, + }); + const wallet = await SignClient.init({ + ...TEST_SIGN_CLIENT_OPTIONS, + name: "wallet", + metadata: TEST_WALLET_METADATA, + }); const { uri } = await dapp.connect(TEST_CONNECT_PARAMS); if (!uri) throw new Error("URI is undefined"); expect(uri).to.exist; From 489ca63cf67cff965bc4659de144b285bf689193 Mon Sep 17 00:00:00 2001 From: Luka Isailovic Date: Mon, 10 Jun 2024 14:53:38 +0200 Subject: [PATCH 6/7] chore: update import to use shared const --- packages/sign-client/test/sdk/client.spec.ts | 2 +- packages/sign-client/test/shared/values.ts | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/sign-client/test/sdk/client.spec.ts b/packages/sign-client/test/sdk/client.spec.ts index 2e9c519db..23ee6c9ab 100644 --- a/packages/sign-client/test/sdk/client.spec.ts +++ b/packages/sign-client/test/sdk/client.spec.ts @@ -1,8 +1,8 @@ -import { TEST_WALLET_METADATA } from "./../../../../providers/universal-provider/test/shared/constants"; import { TEST_APP_METADATA_A, TEST_EMPTY_METADATA, TEST_INVALID_METADATA, + TEST_WALLET_METADATA, } from "./../shared/values"; import { formatJsonRpcError, diff --git a/packages/sign-client/test/shared/values.ts b/packages/sign-client/test/shared/values.ts index a400b8bbd..6eab4a70d 100644 --- a/packages/sign-client/test/shared/values.ts +++ b/packages/sign-client/test/shared/values.ts @@ -285,3 +285,10 @@ export const TEST_INVALID_METADATA: SignClientTypes.Metadata = { url: "", icons: ["test"], }; + +export const TEST_WALLET_METADATA = { + name: "Test Wallet", + description: "Test Wallet for WalletConnect", + url: "https://walletconnect.com/", + icons: ["https://avatars.githubusercontent.com/u/37784886"], +}; From 28554fbac9f04e67c05c3e7f62f027bd872138d0 Mon Sep 17 00:00:00 2001 From: Luka Isailovic Date: Mon, 10 Jun 2024 15:18:53 +0200 Subject: [PATCH 7/7] chore: import from package consts --- providers/ethereum-provider/test/index.spec.ts | 2 +- providers/ethereum-provider/test/shared/constants.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/providers/ethereum-provider/test/index.spec.ts b/providers/ethereum-provider/test/index.spec.ts index 62f9ee30b..047979732 100644 --- a/providers/ethereum-provider/test/index.spec.ts +++ b/providers/ethereum-provider/test/index.spec.ts @@ -1,4 +1,3 @@ -import { TEST_APP_METADATA_A } from "./../../../packages/sign-client/test/shared/values"; import { afterAll, beforeAll, describe, expect, it } from "vitest"; import Web3 from "web3"; import { BigNumber, providers, utils } from "ethers"; @@ -24,6 +23,7 @@ import { TEST_ETHEREUM_METHODS_REQUIRED, TEST_ETHEREUM_METHODS_OPTIONAL, TEST_WALLET_METADATA, + TEST_APP_METADATA_A, } from "./shared/constants"; import { EthereumProviderOptions } from "../src/EthereumProvider"; import { parseChainId } from "@walletconnect/utils"; diff --git a/providers/ethereum-provider/test/shared/constants.ts b/providers/ethereum-provider/test/shared/constants.ts index 49e4ddba1..09a755611 100644 --- a/providers/ethereum-provider/test/shared/constants.ts +++ b/providers/ethereum-provider/test/shared/constants.ts @@ -83,3 +83,14 @@ export const TEST_ETHEREUM_METHODS_OPTIONAL = [ "personal_sign", "eth_signTypedData", ]; + +export const TEST_APP_METADATA_A = { + name: "App A (Proposer)", + description: "Description of Proposer App run by client A", + url: "https://app.a.walletconnect.com", + icons: ["https://avatars.githubusercontent.com/u/37784886"], + redirect: { + universal: "App A (Proposer)", + native: "App A Native (Proposer)", + }, +};