From 9e4e180da9c3359df71559be477b3ee9cf820b52 Mon Sep 17 00:00:00 2001 From: Omer Bektas Date: Mon, 17 Aug 2026 09:43:38 +0300 Subject: [PATCH] fix(viem): omit missing typed-data chainId --- src/provider/viem-adapter.ts | 2 +- test/provider/viem-adapter.spec.ts | 39 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 test/provider/viem-adapter.spec.ts diff --git a/src/provider/viem-adapter.ts b/src/provider/viem-adapter.ts index d25bc0ced..c1aba8f65 100644 --- a/src/provider/viem-adapter.ts +++ b/src/provider/viem-adapter.ts @@ -89,7 +89,7 @@ function createViemSigner( } return walletClient.signTypedData({ domain: { - chainId: Number(domain.chainId), + chainId: domain.chainId != null ? Number(domain.chainId) : undefined, name: domain.name, version: domain.version, verifyingContract: domain.verifyingContract as `0x${string}`, diff --git a/test/provider/viem-adapter.spec.ts b/test/provider/viem-adapter.spec.ts new file mode 100644 index 000000000..7eb5d2ac7 --- /dev/null +++ b/test/provider/viem-adapter.spec.ts @@ -0,0 +1,39 @@ +import { describe, expect, it, vi } from "vitest" +import { createViemWallet } from "../../src/provider/viem-adapter" + +describe("createViemWallet", () => { + it("does not pass NaN when typed-data domain omits chainId", async () => { + const signTypedData = vi.fn().mockResolvedValue("0xsignature") + const wallet = createViemWallet({ + publicClient: { + waitForTransactionReceipt: vi.fn(), + } as any, + walletClient: { + account: { + address: "0x0000000000000000000000000000000000000001", + }, + signTypedData, + } as any, + }) + + if (!("signer" in wallet)) { + throw new Error("expected wallet signer") + } + + await wallet.signer.signTypedData( + { + name: "OpenSea", + version: "1", + verifyingContract: "0x0000000000000000000000000000000000000002", + } as any, + { + Test: [{ name: "value", type: "string" }], + }, + { value: "hello" }, + ) + + const call = signTypedData.mock.calls[0][0] + expect(call.domain.chainId).toBeUndefined() + expect(Number.isNaN(call.domain.chainId)).toBe(false) + }) +})