繁体   English   中英

如何将令牌发送到 ERC721 合约?

[英]How to get token sent to a ERC721 contract?

我有一个 ERC721 合约,我的铸币方法需要 1 个以太币。 我的合同在这里:

// SPDX-License-Identifier: MIT 
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract Example is ERC721 {

    uint256 private _tokenId = 0;

    function mint(uint256 tokenURI, uint256 id) public payable returns(uint256){
        require(msg.value == 1 ether);
        require(id > 0);
        
        _tokenId += 1;
        _mint(msg.sender, _tokenId);
        _setTokenURI(_tokenId, tokenURI);
        return _tokenId;
    }
}

我的问题是我怎么知道该值存储在哪里? 在浏览器上,我可以看到合约地址上有 1 个以太币,我怎样才能取出代币? 使用 ERC721 中的 balanceOf 只能获取地址拥有的代币数量。 我想查看此合约地址上的值。

您的问题不是 100% 清楚,但看起来您无法获取代币数据,因为您的合同不存储任何代币。

您在智能合约中遗漏了许多基本的东西。 例如,令牌存储在哪里? 我看不到任何数组。 与令牌关联的数据是什么? 我看不到任何定义的结构。

一旦定义了令牌的存储方式,就可以检索它们的数据。

请注意,下面的示例只是向您展示了一个基本的实现,很多东西都需要定义。 如果您只是复制并粘贴它,那么它将不起作用。

YourTokenStruct[] public yourTokens;

struct YourTokenStruct {
    string name;
    uint256 id;
}

function mint(string memory name, uint256 id) public payable returns(uint256){
    require(msg.value == 1 ether);
    require(id > 0);
    
    uint _tokenId = yourTokens.push(YourTokenStruct(name, id)) - 1;

    _mint(msg.sender, _tokenId);

    return _tokenId;
}

如您所见,数组yourTokens存储所有创建的令牌,结构YourTokenStruct定义令牌的数据结构。

我建议您遵循教程https://cryptozombies.io/ ,它解释了有关如何编写 ERC721 令牌标准的所有基础知识。


编辑:以太存储在智能合约地址(部署合约的地址)。 下面是一个 function 的例子,它将以太从智能合约转移到 function 的调用者(当然你自己定义修饰符ifOwner ):

function withdraw() payable external ifOwner {
    msg.sender.transfer(address(this).balance);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM