我有一个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);
}