You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:42:21