使用 OpenZeppelin 的 Solidity 合约中的 _exists() 函数出现未声明的标识符错误

问题描述 投票:0回答:1

问题正文:

我正在使用 OpenZeppelin 库开发 ERC721 合约,在 Solidity 合约中调用 _exists() 时遇到错误。错误信息是:

声明错误:未声明的标识符。

详情:

Solidity version: ^0.8.0
Using OpenZeppelin contracts:

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/common/ERC2981.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

问题:导致错误的行是:

require(_exists(tokenId), "Token不存在");

我以为_exists()可以通过ERC721或ERC721Enumerable使用,但似乎该函数没有被识别。

问题:

Why is _exists() not being recognized in this context?
How can I properly use _exists() to check if a token ID exists in my contract, or what is an appropriate workaround?

任何指导或见解将不胜感激!

我尝试过的:

I imported ERC721 and ERC721Enumerable from OpenZeppelin and used them as base contracts in my custom contract.
I called the _exists(tokenId) function in a tokenURI() method and other functions to check for the existence of tokens.

我的期望:

我希望 Solidity 编译器能够将 _exists() 函数识别为 ERC721 或 ERC721Enumerable 基础合约的一部分,从而允许我检查代币 ID 是否存在而没有问题。

实际发生的事情:

编译器抛出以下错误:

声明错误:未声明的标识符。

在调用 _exists() 的每个实例中都会发生这种情况,表明该函数在我当前的合同范围内不可用或未被识别。

solidity smartcontracts openzeppelin remix-ide
1个回答
0
投票

我猜,问题是由合约中正确的继承和函数可见性引起的。

  1. 检查你的合约是否正确继承自ERC721。
  2. 检查功能可见性。
  • 如果您的合约继承自ERC721,请直接使用内部
    _exist()
    函数。
  • 创建一个公共包装函数来检查令牌是否存在。
  • 使用
    ownerOf()
    函数作为替代方法。

希望对您有所帮助。 谢谢

© www.soinside.com 2019 - 2024. All rights reserved.