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

