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

修改ERC721 NFT铸造合约添加付费逻辑后触发ETH不足报错求助

合约存在的问题及修复方案

    1. 构造函数未初始化shopOwner变量
      当前构造函数没有给shopOwner赋值,默认值为0地址,会导致withdraw函数的权限校验永远不通过,无法提现。
      修复方式:在构造函数中添加赋值逻辑
constructor() ERC721Full('Memory Token', 'MEMORY') public {
    shopOwner = msg.sender;
}
    1. 铸造手续费校验规则未生效+调用参数错误
      你当前代码中的手续费校验行处于注释状态,且校验阈值写的是2ETH不是你需要的0.05ETH,同时报错提示已经明确是ETH支付不足,说明你前端调用mint方法时没有附带足额的ETH价值,或者没有传递value参数。
      修复方式:
    2. 打开注释修改阈值
    function mint(address _to, string memory _tokenURI ) public payable returns(bool){
        require(msg.value >= 0.05 ether, "Not enough ETH sent: check price.");
        uint _tokenId= totalSupply().add(1);
        _mint(_to, _tokenId);
        _setTokenURI(_tokenId, _tokenURI);
        return true;
    }
    
    1. 前端调用mint合约方法时,必须附带value参数,值为0.05 ether对应的wei数值,示例(web3.js调用参考):
    memoryToken.methods.mint(toAddress, tokenUri)
      .send({
        from: userAddress,
        value: web3.utils.toWei('0.05', 'ether')
      })
    
    1. 函数命名冲突
      你新增的balanceOf函数和ERC721标准中查询用户NFT持有量的balanceOf(address owner)函数签名冲突,会导致前端调用时出现预期外的返回值。
      修复方式:重命名合约余额查询函数
function getContractBalance() public view returns(uint){
    return address(this).balance;
}
    1. 冗余的payable修饰符
      withdraw函数是向外转出资金,不需要接收ETH,payable修饰符属于冗余,可以直接移除。
      修复方式:
function withdraw() public {
    require(msg.sender == shopOwner, 'only shopOwner can withdraw');
    msg.sender.transfer(address(this).balance);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:45:03