Next.js13+ethers.js V6铸NFT时遇receipt.confirmations非函数错误
解决ethers.js v6中
receipt.confirmations is not a function错误 核心原因
你遇到的错误源于ethers.js v6的API重大变更:
- 原v5中的
Web3Provider已被重命名为BrowserProvider,继续使用旧API会触发内部监听逻辑调用错误属性——v6中TransactionReceipt.confirmations是数字类型,而非v5中的函数; - 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
相关产品推荐
相关产品推荐

