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

使用wagmi usePrepareContractWrite遇ABI编码参数值长度不匹配问题

解决wagmi usePrepareContractWrite参数长度不匹配错误

问题原因

报错ABI encoding params/values length mismatch. Expected length (params):2 Given length (values):0的核心原因是:ERC721的setApprovalForAll函数需要2个参数(授权目标地址operator、授权状态approved),但你在usePrepareContractWrite中未传入args参数,预准备阶段无法完成ABI编码的参数匹配验证。

解决方案

方案1:传入固定参数到usePrepareContractWrite

直接在预准备钩子中补充setApprovalForAll所需的参数,让预准备阶段完成参数验证和编码:

const { config } = usePrepareContractWrite({
    ...ContractConfig,
    functionName: 'setApprovalForAll',
    args: [BatchTransferAddress, true], // 补充两个必填参数
});

此时调用write时可省略args(无需重复传入):

const { data, write } = useContractWrite(config);

if (write) {
    write({ from: address });
}

方案2:处理动态参数场景

如果BatchTransferAddress是动态获取的(比如用户输入、异步返回),需添加enabled条件,确保参数就绪后再执行预准备:

import { useState } from 'react';

// 假设授权地址为动态状态
const [BatchTransferAddress, setBatchTransferAddress] = useState('');

const { config } = usePrepareContractWrite({
    ...ContractConfig,
    functionName: 'setApprovalForAll',
    args: [BatchTransferAddress, true],
    enabled: !!BatchTransferAddress, // 仅当地址有效时才触发预准备
});

const { data, write } = useContractWrite(config);

// 参数就绪且write可用时执行调用
if (write && BatchTransferAddress) {
    write({ from: address });
}

补充说明

你之前的useContractWrite能运行,是因为在write方法中手动传入了args,绕过了预准备阶段的参数检查,但usePrepareContractWrite的核心作用就是提前完成参数验证、Gas估算等前置操作,必须在该钩子中提供匹配的参数才能彻底消除报错。

内容的提问来源于stack exchange,提问作者Sagar Atalatti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:14:51