From aa16561baaba12e492adec164d454a302bae34f5 Mon Sep 17 00:00:00 2001 From: jxom Date: Sat, 25 May 2024 10:16:20 +1000 Subject: [PATCH 1/3] repro --- src/utils/signature/verifyTypedData.test.ts | 86 +++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/utils/signature/verifyTypedData.test.ts b/src/utils/signature/verifyTypedData.test.ts index 1f352da3fa..ab6023085e 100644 --- a/src/utils/signature/verifyTypedData.test.ts +++ b/src/utils/signature/verifyTypedData.test.ts @@ -2,8 +2,15 @@ import { expect, test } from 'vitest' import { accounts, typedData } from '~test/src/constants.js' +import type { Address } from 'abitype' +import { anvilMainnet } from '../../../test/src/anvil.js' +import { signTypedData } from '../../actions/index.js' +import { getAddress } from '../address/getAddress.js' +import { recoverTypedDataAddress } from './recoverTypedDataAddress.js' import { verifyTypedData } from './verifyTypedData.js' +const client = anvilMainnet.getClient() + test('default', async () => { expect( await verifyTypedData({ @@ -25,3 +32,82 @@ test('default', async () => { }), ).toBeTruthy() }) + +test.only('https://github.com/wevm/viem/issues/2306', async () => { + const typedData = (address: Address) => + ({ + types: { + WalletData: [{ name: 'address', type: 'address' }], + }, + message: { + address, + }, + primaryType: 'WalletData', + }) as const + + const address = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' + const nonChecksumAddress = address.toLowerCase() as `0x${string}` + const invalidChecksumAddress = address.replace('f', 'F') as `0x${string}` + + // ✅ Successfully signs with valid checksum address. + const signature = await signTypedData(client, { + ...typedData(address), + account: address, + }) + + // ✅ Successfully signs with non-checksum address. + const signature_2 = await signTypedData(client, { + ...typedData(nonChecksumAddress), + account: nonChecksumAddress, + }) + expect(signature_2).toEqual(signature) + + // ❌ Throws when invalid checksum address provided. + await expect(() => + signTypedData(client, { + ...typedData(invalidChecksumAddress), + account: invalidChecksumAddress, + }), + ).rejects.toMatchInlineSnapshot(` + [InvalidAddressError: Address "0xF39Fd6e51aad88F6F4ce6aB8827279cffFb92266" is invalid. + + - Address must be a hex value of 20 bytes (40 hex characters). + - Address must match its checksum counterpart. + + Version: viem@1.0.2] + `) + + // ✅ Successfully verifies with valid checksum address. + expect( + await verifyTypedData({ + ...typedData(address), + signature, + address: address, + }), + ).toBeTruthy() + + // ✅ Successfully verifies with non-checksum address. + expect( + await verifyTypedData({ + ...typedData(nonChecksumAddress), + signature, + address: nonChecksumAddress, + }), + ).toBeTruthy() + + // ❌ Throws when invalid checksum address provided. + await expect(() => + verifyTypedData({ + ...typedData(invalidChecksumAddress), + signature, + address: invalidChecksumAddress, + }), + ).rejects.toMatchInlineSnapshot(` + [InvalidAddressError: Address "0xF39Fd6e51aad88F6F4ce6aB8827279cffFb92266" is invalid. + + - Address must be a hex value of 20 bytes (40 hex characters). + - Address must match its checksum counterpart. + + Version: viem@1.0.2] + `) +}) From e904b1f24bb664851ead44412fd9930f9894dd80 Mon Sep 17 00:00:00 2001 From: jxom Date: Sat, 25 May 2024 10:17:02 +1000 Subject: [PATCH 2/3] remove .only --- src/utils/signature/verifyTypedData.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/signature/verifyTypedData.test.ts b/src/utils/signature/verifyTypedData.test.ts index ab6023085e..2024730d57 100644 --- a/src/utils/signature/verifyTypedData.test.ts +++ b/src/utils/signature/verifyTypedData.test.ts @@ -33,7 +33,7 @@ test('default', async () => { ).toBeTruthy() }) -test.only('https://github.com/wevm/viem/issues/2306', async () => { +test('https://github.com/wevm/viem/issues/2306', async () => { const typedData = (address: Address) => ({ types: { From c1bc314a4e641ed019fa72a65adf2dc667f016d6 Mon Sep 17 00:00:00 2001 From: jxom Date: Sat, 25 May 2024 10:17:50 +1000 Subject: [PATCH 3/3] imports --- src/utils/signature/verifyTypedData.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/utils/signature/verifyTypedData.test.ts b/src/utils/signature/verifyTypedData.test.ts index 2024730d57..0d970f0464 100644 --- a/src/utils/signature/verifyTypedData.test.ts +++ b/src/utils/signature/verifyTypedData.test.ts @@ -1,12 +1,10 @@ +import type { Address } from 'abitype' import { expect, test } from 'vitest' import { accounts, typedData } from '~test/src/constants.js' -import type { Address } from 'abitype' import { anvilMainnet } from '../../../test/src/anvil.js' import { signTypedData } from '../../actions/index.js' -import { getAddress } from '../address/getAddress.js' -import { recoverTypedDataAddress } from './recoverTypedDataAddress.js' import { verifyTypedData } from './verifyTypedData.js' const client = anvilMainnet.getClient()