合约执行时遇到错误[堆栈下溢(0 <=> 2)]

Error encountered during contract execution [stack underflow (0 <=> 2)]

我正在开发 ERC721 合约。每当我调用我的 mint 函数时,我都会收到此错误:

合约执行时遇到错误[堆栈下溢(0 <=> 2)]

我的函数只包含一个简单的 require 和 return 语句。

非常感谢任何帮助

然后我降级到 Sol 0.6.6 但我一直遇到同样的问题。当我要确认交易时,甚至元掩码也会显示此消息:

这是我的 Mint 功能:

function Mint() notBroke external payable returns (uint256) {  

    require(msg.value >= 0.05 ether, 'You didnt pay enough Eth Buddy :/'); 

    return 1;
}

这是我的 notBroke 修改器:

   modifier notBroke() {
    require(address(this).balance > 0 ether,"You  Broke");
    _;
}

这就是我从前端提交事务的方式(使用元掩码):

        const transactionParameters = {
              to: Contract.address, 
              from: props.account, // must match user's active address.
              value: parseInt(Web3.utils.toWei("0.05", 'ether')).toString(16), 
              data: web3.eth.abi.encodeFunctionCall(    
                {
                    "inputs": [],
                    "name": "Mint",
                    "outputs": [
                      {
                        "internalType": "uint256",
                        "name": "",
                        "type": "uint256"
                      }
                    ],
                    "stateMutability": "payable",
                    "type": "function"
                  },[]
            ),
              chainId: `0x${parseInt(props.network)}`, // Used to prevent transaction reuse across blockchains. Auto-filled by MetaMask.
            };


            await window.ethereum.request({
              method: 'eth_sendTransaction',
              params: [transactionParameters],
            }).then( (result) => {

                 resolve(result) 

            }).catch((error)=> resolve(error))

这是 Etherscan 上显示的内容:

这里你添加了修饰符,这意味着你的合约余额应该大于 0,所以第一次你的合约将有 0 个以太币,所以它会恢复交易,请尝试检查你的合约余额,我认为你是这样的应该检查想要铸造令牌的用户余额

如果合约地址(不是发件人地址)的余额为0,修饰符会抛出异常(有效地恢复交易)并显示消息“You Broke”。


如果你想更新修饰符以仅在发件人地址余额为 0 时恢复,你需要使用 msg.sender 而不是 address(this):

require(msg.sender.balance > 0 ether,"You  Broke");