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

以太坊合约部署失败求助:Hardhat与Remix均遇执行回滚错误

合约部署失败原因排查及修复方案

核心问题1:缺少Strings库导入

你的tokenURI函数中使用了Strings.toString(tokenId_),但未导入OpenZeppelin提供的Strings工具库,这会直接导致编译或执行阶段报错,引发部署回滚。

修复方法:
在合约开头添加导入语句:

import '@openzeppelin/contracts/utils/Strings.sol';

核心问题2:未初始化withdrawWallet变量

构造函数中注释掉了withdrawWallet的赋值逻辑,虽然这不会直接导致部署失败,但后续调用withdraw函数时会触发回滚(因为调用了空地址)。

修复方法:
在构造函数中替换注释代码,填入实际收款钱包地址(需转换为address payable类型):

withdrawWallet = payable("你的钱包地址");

其他潜在问题修正

  • 函数名拼写错误:setIsPublicisMintEnabled中的isPublicis应为isPublic,修正为setIsPublicMintEnabled,避免后续调用函数时出错。
  • 冗余转义字符:tokenURI中的"\.json"可简化为".json",Solidity字符串中的.无需转义。

修复后完整合约代码

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

import '@openzeppelin/contracts/token/ERC721/ERC721.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Strings.sol'; // 新增Strings库导入

contract RoboPunksNFT is ERC721, Ownable {
    uint256 public mintPrice;
    uint256 public totalSupply;
    uint256 public maxSupply;
    uint256 public maxPerWallet;
    bool public isPublicMintEnabled;
    string internal baseTokenUri;
    address payable public withdrawWallet;
    mapping(address => uint256) public walletMints;

    constructor() payable ERC721('RoboPunks', 'RP') {
        mintPrice = 0.02 ether;
        totalSupply = 0;
        maxSupply = 1000;
        maxPerWallet = 3;
        withdrawWallet = payable("你的钱包地址"); // 初始化收款钱包
    }

    // 修正函数名拼写错误
    function setIsPublicMintEnabled(bool isPublicMintEnabled_) external onlyOwner {
        isPublicMintEnabled = isPublicMintEnabled_;
    }

    function setBaseTokenUri(string calldata baseTokenUri_) external onlyOwner {
        baseTokenUri = baseTokenUri_;
    }

    function tokenURI(uint256 tokenId_) public view override returns (string memory) {
        require(_exists(tokenId_), 'Token does not exist!');
        // 移除冗余转义字符
        return string(abi.encodePacked(baseTokenUri, Strings.toString(tokenId_), ".json"));
    }

    function withdraw() external onlyOwner {
        (bool success, ) = withdrawWallet.call{value: address(this).balance } ('');
        require(success, 'withdraw failed');
    }

    function mint(uint quantity_) public payable {
        require(isPublicMintEnabled, 'minting not enabled');
        require(msg.value == quantity_ * mintPrice, 'wrong mint value');
        require(totalSupply + quantity_ <= maxSupply, 'sold out');
        require(walletMints[msg.sender] + quantity_ <= maxPerWallet, 'exceed max wallet');

        for (uint256 i = 0; i < quantity_; i++) {
            uint256 newTokenId = totalSupply + 1;
            totalSupply++;
            _safeMint(msg.sender, newTokenId);
        }
        walletMints[msg.sender] += quantity_; 
    }
}

部署验证步骤

  1. 确保依赖库安装完整:Hardhat环境下执行npm install @openzeppelin/contracts。
  2. 修复代码后重新编译,确认无编译错误。
  3. 使用Hardhat或Remix重新部署,此时应能成功完成部署,无execution reverted错误。

内容的提问来源于stack exchange,提问作者marcos felicia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:19:57