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



我有一个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令牌标准的所有基础知识。


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

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

相关内容

  • 没有找到相关文章

最新更新