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

如何从wagmi合约调用回滚中提取精确错误信息?

提取Viem/Wagmi中合约自定义回滚错误的方法

在使用viem ^2.7.1和wagmi ^2.5.5时,要提取合约自定义的InvalidFirstName()回滚错误,可通过以下两种方式实现:

方法一:通过ABI解码(推荐)

Viem提供了decodeErrorResult工具函数,能直接解码合约回滚的ABI编码数据,精准匹配自定义错误。

步骤:

  1. 定义自定义错误的ABI片段
  2. 在获取到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:55:01