From 4d52c74d318daf4eebb0dae43f581aa20ef62118 Mon Sep 17 00:00:00 2001 From: "moxey.eth" Date: Sat, 16 Mar 2024 09:16:19 +1100 Subject: [PATCH] fix: #1960 --- .changeset/small-shirts-admire.md | 5 +++++ src/utils/abi/encodeAbiParameters.test.ts | 20 ++++++++++++++++++++ src/utils/abi/encodeAbiParameters.ts | 5 +++++ 3 files changed, 30 insertions(+) create mode 100644 .changeset/small-shirts-admire.md diff --git a/.changeset/small-shirts-admire.md b/.changeset/small-shirts-admire.md new file mode 100644 index 0000000000..af6e678d01 --- /dev/null +++ b/.changeset/small-shirts-admire.md @@ -0,0 +1,5 @@ +--- +"viem": patch +--- + +Fixed boolean conversion issue. diff --git a/src/utils/abi/encodeAbiParameters.test.ts b/src/utils/abi/encodeAbiParameters.test.ts index 539cb84623..cbb584a86a 100644 --- a/src/utils/abi/encodeAbiParameters.test.ts +++ b/src/utils/abi/encodeAbiParameters.test.ts @@ -1776,3 +1776,23 @@ test('getArrayComponents', () => { expect(getArrayComponents('uint256[][]')).toEqual([null, 'uint256[]']) expect(getArrayComponents('uint256')).toBeUndefined() }) + +test('https://github.com/wevm/viem/issues/1960', () => { + expect(() => + encodeAbiParameters( + [ + { + name: 'boolz', + type: 'bool[]', + internalType: 'bool[]', + }, + ] as const, + // @ts-expect-error + [['true']], + ), + ).toThrowErrorMatchingInlineSnapshot(` + [ViemError: Invalid boolean value: "true" (type: string). Expected: \`true\` or \`false\`. + + Version: viem@1.0.2] + `) +}) diff --git a/src/utils/abi/encodeAbiParameters.ts b/src/utils/abi/encodeAbiParameters.ts index 6a76895f75..4670b8d5ad 100644 --- a/src/utils/abi/encodeAbiParameters.ts +++ b/src/utils/abi/encodeAbiParameters.ts @@ -20,6 +20,7 @@ import { InvalidAddressError, type InvalidAddressErrorType, } from '../../errors/address.js' +import { BaseError } from '../../errors/base.js' import type { ErrorType } from '../../errors/utils.js' import type { Hex } from '../../types/misc.js' import { type IsAddressErrorType, isAddress } from '../address/isAddress.js' @@ -311,6 +312,10 @@ export type EncodeBoolErrorType = | ErrorType function encodeBool(value: boolean): PreparedParam { + if (typeof value !== 'boolean') + throw new BaseError( + `Invalid boolean value: "${value}" (type: ${typeof value}). Expected: \`true\` or \`false\`.`, + ) return { dynamic: false, encoded: padHex(boolToHex(value)) } }