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

Mar*_*cel 3 ethereum solidity truffle openzeppelin

我正在编写关于 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;
  } }
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Pet*_*jda 8

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

由于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
Run Code Online (Sandbox Code Playgroud)

  • 当我下个月赚到几百万美元时,我一定会给你捐款。 (5认同)