首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务失败错误

事务失败错误
EN

Ethereum用户
提问于 2022-05-11 12:11:53
回答 1查看 38关注 0票数 1

当我加上下面的一行时-

代码语言:javascript
复制
require(msg.value > 0.1 ether);

我得到了以下错误-

代码语言:javascript
复制
Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?
execution reverted

它的原因是什么,我如何解决?

这是我最聪明的合同-

代码语言:javascript
复制
// 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);
}

}

EN

回答 1

Ethereum用户

发布于 2022-05-14 11:03:55

你的智能合同代码起作用了。添加此条件时可能会出现问题:

代码语言:javascript
复制
require(msg.value > 0.1 ether);

是在REMIX中,您不会在部署和运行值文本框下面的msg.value文本框中设置值。总之,当您调用purchaseNft()时,必须在值文本框内设置值(参见此图像)。我对您的功能进行了改进,特别是您可以看到以下代码:

代码语言:javascript
复制
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的值是您的智能契约地址,而不是用户钱包地址。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/128016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档