声明错误:未声明的标识符-尽管它存在于ERC721.sol中

我正在编写关于 Solidity 0.8.3 的合同,_setTokenURI()尽管该方法是在 OpenZeppelin 4.X 中定义的,但我收到了这个奇怪的错误。

pragma solidity ^0.8.3;

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

contract NFTB is ERC721 {

  using Counters for Counters.Counter;
  Counters.Counter private _tokenIds;
  mapping(string => uint8) hashes;

  constructor() public ERC721("NFTB", "NFTB") {}

  function awardItem(address recipient, string memory hash, string memory metadata) public returns (uint256) {
    require(hashes[hash] != 1);
    hashes[hash] = 1;
    _tokenIds.increment();
    uint256 newItemId = _tokenIds.current();
    _setTokenURI(newItemId, metadata);
    _mint(recipient, newItemId);
    return newItemId;
  } }

回答

函数_setTokenURI()@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol(GitHub 上的源代码)中定义,但此合约不是由您的代码导入(包括嵌套导入)。这就是未声明该函数的原因。

由于ERC721URIStorageextends ERC721,您可以NFTB直接从ERC721URIStorage.

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; // changed import
import "@openzeppelin/contracts/utils/Counters.sol";

contract NFTB is ERC721URIStorage { // changed parent

  • When I make a few million $USD in the next month, I'll surely give you a donation.

以上是声明错误:未声明的标识符-尽管它存在于ERC721.sol中的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>