Hardhat Viem测试触发AbiEncodingLengthMismatchError问题求助
解决Viem调用合约函数时的ABI编码长度不匹配错误
问题场景
你的智能合约包含以下函数:
function isCategoryValid(bytes32 category) external view returns (bool) { return validCategories[category]; }
使用Viem v1.18.4编写的测试代码在调用该函数时,触发了ABI编码错误。测试代码如下:
import { loadFixture } from "@nomicfoundation/hardhat-toolbox-viem/network-helpers"; import { expect } from "chai"; import hre from "hardhat"; import { stringToHex, getAddress, encodeAbiParameters } from "viem"; describe("CategoryStorage", function () { let CategoryStorage: any, owner: any, nonOwner: any; async function deployCategoryStorageFixture() { const initialCategories = [stringToHex("InitialCategory", { size: 32 })]; const CategoryStorage = await hre.viem.deployContract("CategoryStorage", [initialCategories]); const [owner, nonOwner] = await hre.viem.getWalletClients(); return { CategoryStorage, owner, nonOwner }; } beforeEach(async function () { ({ CategoryStorage, owner, nonOwner } = await loadFixture(deployCategoryStorageFixture)); }); describe("Deployment", function () { it("Should set the right owner", async function () { expect(await CategoryStorage.read.owner()).to.equal(getAddress(owner.account.address)); }); it("Should initialize with valid categories", async function () { const initialCategory = stringToHex("InitialCategory", { size: 32 }); expect(await CategoryStorage.read.isCategoryValid(initialCategory)).to.be.true; }); }); });
错误信息:
AbiEncodingLengthMismatchError: ABI编码参数/值长度不匹配。预期长度(参数):1 给定长度(值):0
问题原因
Viem的合约read方法要求所有参数必须包裹在数组中,哪怕只有一个参数。你之前直接传递单个initialCategory值,Viem会把它当成空数组处理,和ABI定义的1个参数要求不匹配,从而触发编码错误。
修复方案
修改测试中调用isCategoryValid的代码,把参数放进数组里:
it("Should initialize with valid categories", async function () { const initialCategory = stringToHex("InitialCategory", { size: 32 }); expect(await CategoryStorage.read.isCategoryValid([initialCategory])).to.be.true; });
这样Viem就能正确识别参数数量,匹配ABI的要求,编码时就不会再报错了。
内容的提问来源于stack exchange,提问作者Shiftlemac
相关产品推荐
相关产品推荐

