From b2252f06572c3e0330c31a05f34d936276eacca8 Mon Sep 17 00:00:00 2001 From: Derek Rein Date: Mon, 9 Mar 2026 10:43:48 +0700 Subject: [PATCH 1/2] fix(cli-sdk): route sign-typed-data requests to correct chain cmdSignTypedData was always sending eth_signTypedData_v4 requests on eip155:1 (the first account) regardless of the typed data's actual chainId. Wallets like Zerion would ignore or expire requests sent on the wrong chain, causing silent failures. Now extracts chainId from the typed data domain and finds the matching account (e.g. eip155:137 for Polygon) before sending the request. Co-Authored-By: Claude Opus 4.6 --- packages/cli-sdk/src/cli.ts | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/cli-sdk/src/cli.ts b/packages/cli-sdk/src/cli.ts index c8af652..2ec4c53 100644 --- a/packages/cli-sdk/src/cli.ts +++ b/packages/cli-sdk/src/cli.ts @@ -174,25 +174,37 @@ async function cmdSignTypedData(typedDataJson: string, browser: boolean): Promis console.log(); } - const { chain, address } = parseAccount(result.accounts[0]); - // Validate JSON before sending + let typedData: { domain?: { chainId?: string | number } }; try { - JSON.parse(typedDataJson); + typedData = JSON.parse(typedDataJson); } catch { console.error("Error: Invalid JSON for typed data. Provide a valid EIP-712 JSON string."); process.exit(1); } + // Extract chainId from typed data domain to find the matching account + const domainChainId = typedData.domain?.chainId; + let account: { chain: string; address: string }; + if (domainChainId !== undefined) { + const targetChain = `eip155:${domainChainId}`; + const match = result.accounts + .map((a) => parseAccount(a)) + .find((a) => a.chain === targetChain); + account = match || parseAccount(result.accounts[0]); + } else { + account = parseAccount(result.accounts[0]); + } + const signature = await sdk.request({ - chainId: chain, + chainId: account.chain, request: { method: "eth_signTypedData_v4", - params: [address, typedDataJson], + params: [account.address, typedDataJson], }, }); - console.log(JSON.stringify({ address, signature })); + console.log(JSON.stringify({ address: account.address, signature })); } finally { await sdk.destroy(); } From 8e3c7b2dd7862c30f88238d62fe5ef672bdd1608 Mon Sep 17 00:00:00 2001 From: Derek Rein Date: Mon, 9 Mar 2026 16:27:55 +0700 Subject: [PATCH 2/2] chore: add missing changeset for sign-typed-data chain routing fix Co-Authored-By: Claude Opus 4.6 --- .changeset/fix-sign-typed-data-chain.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fix-sign-typed-data-chain.md diff --git a/.changeset/fix-sign-typed-data-chain.md b/.changeset/fix-sign-typed-data-chain.md new file mode 100644 index 0000000..941c751 --- /dev/null +++ b/.changeset/fix-sign-typed-data-chain.md @@ -0,0 +1,5 @@ +--- +"@walletconnect/cli-sdk": patch +--- + +Fix sign-typed-data routing to use the correct chain from the typed data domain instead of always defaulting to eip155:1