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

Next.js13+ethers.js V6铸NFT时遇receipt.confirmations非函数错误

解决ethers.js v6中receipt.confirmations is not a function错误

核心原因

你遇到的错误源于ethers.js v6的API重大变更:

  1. 原v5中的Web3Provider已被重命名为BrowserProvider,继续使用旧API会触发内部监听逻辑调用错误属性——v6中TransactionReceipt.confirmations是数字类型,而非v5中的函数;
  2. v6中getSigner()方法返回Promise,必须用await获取签名者。

修复步骤

1. 替换Provider类型并修正签名者获取

将代码中的旧Provider替换为v6兼容的类型,并补充await获取签名者:

// 原代码
const provider = new Web3Provider(window.ethereum);
const signer = provider.getSigner();

// 修正后
const provider = new ethers.BrowserProvider(window.ethereum);
const signer = await provider.getSigner(); // 必须添加await

2. 完整修正后的组件代码

const mintToken = async () => {
  if (!uri || !price) {
    setError("URI and Price are required");
    return;
  }
  setLoading(true);
  setError(null);

  try {
    // 检查钱包是否存在
    if (typeof window.ethereum === "undefined") {
      setError("请安装MetaMask或其他以太坊钱包");
      setLoading(false);
      return;
    }

    // 初始化v6兼容的Provider和Signer
    const provider = new ethers.BrowserProvider(window.ethereum);
    const signer = await provider.getSigner();

    const contractAddress = "CONTRACT_ADDRESS";
    const contractABI = ContractArtifact.abi;

    const contract = new ethers.Contract(
      contractAddress,
      contractABI,
      signer
    );
    const tx = await contract.safeMint(uri, ethers.parseEther(price));

    // 等待交易上链
    const receipt = await tx.wait();

    // 安全获取Mint事件(建议通过事件名称过滤,避免索引错误)
    const mintEvent = receipt.events.find(evt => evt.eventName === "Transfer");
    if (!mintEvent) {
      throw new Error("未找到Mint触发的Transfer事件");
    }
    const tokenId = mintEvent.args[2].toNumber();

    setTokenId(tokenId);
    setLoading(false);
  } catch (err) {
    setError("铸造NFT失败: " + (err as Error).message);
    setLoading(false);
  }
};

3. 额外排查点

  • 检查依赖版本:执行npm ls ethers确保项目中只有v6版本的ethers,没有混合v5依赖;
  • 确认合约ABI正确性:确保safeMint的参数顺序和合约定义一致(部分合约的safeMint第一个参数是接收者地址,而非URI);
  • 事件获取逻辑:避免直接通过索引receipt.events[0]获取事件,建议通过eventName过滤,防止合约事件顺序变化导致错误。

内容的提问来源于stack exchange,提问作者Mouza AlShehhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:21:07