合约执行时遇到错误[堆栈下溢(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");
我正在开发 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");