使用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
相关产品推荐
相关产品推荐

