当我加上下面的一行时-
require(msg.value > 0.1 ether);我得到了以下错误-
Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?
execution reverted它的原因是什么,我如何解决?
这是我最聪明的合同-
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol";
contract Tokens is ERC1155 {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC1155("https://ipfs.io/ipfs/bafybeic3yphboh7wtzr6rr4zz/NFT{id}") {
}
function uri(uint256 tokenId) override public pure returns (string memory) {
return(
string(abi.encodePacked(
"https://ipfs.io/ipfs/bafybeic3yphboh7wtzr6rr4zz/NFT",
Strings.toString(tokenId),
".jpg"
))
);
}
function mintNFT(uint256 amount) public returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(msg.sender, newItemId, amount, "");
return newItemId;
}
function purchaseNFT(address from, uint id, uint amount) public payable {
require(ERC1155.balanceOf(from, id) >= amount);
require(msg.value > 1 ether);
ERC1155.safeTransferFrom(from, msg.sender, id, amount, "");
}
function approve(address to) public
{
ERC1155.setApprovalForAll(to, true);
}}
发布于 2022-05-14 11:03:55
你的智能合同代码起作用了。添加此条件时可能会出现问题:
require(msg.value > 0.1 ether);是在REMIX中,您不会在部署和运行值文本框下面的msg.value文本框中设置值。总之,当您调用purchaseNft()时,必须在值文本框内设置值(参见此图像)。我对您的功能进行了改进,特别是您可以看到以下代码:
function purchaseNFT(address to, uint id, uint amount) public payable {
address from = msg.sender;
require(ERC1155.balanceOf(from, id) >= amount, "Error on balanceOf() line!");
require(msg.value > 0.1 ether, "Error on check msg.value line!");
ERC1155.safeTransferFrom(from, to, id, amount, "");
}我将msg.sender设置为from变量,因为当您编写ERC1155时,安全传输来自(from,msg.sender,id,and,"");在智能契约代码中,关于msg.sender的值是您的智能契约地址,而不是用户钱包地址。
https://ethereum.stackexchange.com/questions/128016
复制相似问题