如何从wagmi合约调用回滚中提取精确错误信息?
提取Viem/Wagmi中合约自定义回滚错误的方法
在使用viem ^2.7.1和wagmi ^2.5.5时,要提取合约自定义的InvalidFirstName()回滚错误,可通过以下两种方式实现:
方法一:通过ABI解码(推荐)
Viem提供了decodeErrorResult工具函数,能直接解码合约回滚的ABI编码数据,精准匹配自定义错误。
步骤:
- 定义自定义错误的ABI片段
- 在获取到
failureReason后,用函数解码并判断错误类型
示例代码:
import { decodeErrorResult } from 'viem'; import { useSimulateContract } from 'wagmi'; // 与合约中自定义错误完全匹配的ABI片段 const customErrorsAbi = [ { name: 'InvalidFirstName', type: 'error', inputs: [], }, ] as const; function YourComponent() { const { failureReason } = useSimulateContract({ address: '你的合约地址', abi: 你的合约ABI, // 需包含addNewPerson函数的ABI functionName: 'addNewPerson', args: ['', 'Doe'], // 传入空firstName触发错误 }); if (failureReason) { try { const decodedError = decodeErrorResult({ abi: customErrorsAbi, data: failureReason.data, }); // 匹配到目标错误后执行逻辑 if (decodedError.name === 'InvalidFirstName') { console.log('触发无效名字错误'); // 这里添加你的错误处理逻辑 } } catch (e) { // 解码失败,说明不是目标自定义错误 console.log('其他错误:', failureReason.message); } } return <div>...</div>; }
方法二:从错误消息字符串匹配(应急用)
如果不想处理ABI解码,可直接从failureReason.message中匹配错误标识,但这种方法依赖Viem的错误消息格式,存在兼容性风险:
if (failureReason?.message.includes('InvalidFirstName()')) { console.log('触发了InvalidFirstName错误'); }
注意事项
- 自定义错误ABI必须和合约中的定义完全一致,包括错误名称、输入参数(本例中
InvalidFirstName无参数,所以inputs为空数组) decodeErrorResult解码失败会抛出错误,需用try/catch包裹避免影响其他逻辑
内容的提问来源于stack exchange,提问作者Andon Mitev
相关产品推荐
相关产品推荐

