solidity - OpenZeppelin:类型错误:函数已指定覆盖但未覆盖任何内容

标签 solidity smartcontracts openzeppelin

从版本 4.6 中的 @openzeppelin/contracts 更新到 4.8 后,solidity 编译器提示 _beforeTokenTransfer 函数,我必须重写该函数:

TypeError: Function has override specified but does not override anything.

) internal virtual override (ERC721, ERC721Enumerable, ERC721Pausable) {

还有:

TypeError: Invalid contracts specified in override list: "ERC721", "ERC721Enumerable" and "ERC721Pausable".

     ) internal virtual override (ERC721, ERC721Enumerable, ERC721Pausable) {
    |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Note: This contract: 
  --> @openzeppelin/contracts/token/ERC721/ERC721.sol:19:1:

19 | contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: This contract: 
  --> @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol:14:1:
   |
14 | abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
   | ^ (Relevant source part starts here and spans across multiple lines).
Note: This contract: 
  --> @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol:22:1:
   |
22 | abstract contract ERC721Pausable is ERC721, Pausable {
   | ^ (Relevant source part starts here and spans across multiple lines).

我的契约(Contract)继承以下内容:

contract XYZ is
    ERC721,
    ERC721Enumerable,
    ERC721Burnable,
    ERC721Pausable,
    ERC721URIStorage,
    Ownable,
    AccessControlEnumerable
{
}

由于我必须重写 _beforeTokenTransfer,所以我有以下代码:

function _beforeTokenTransfer(
    address from,
    address to,
    uint256 amount
) internal virtual override (ERC721, ERC721Enumerable, ERC721Pausable) {
    super._beforeTokenTransfer(from, to, amount);
}

使用较旧的 OpenZeppelin,它可以工作并编译。发生了什么?

最佳答案

OpenZeppelin 4.8 中有一个重大变化。他们更改了函数 _beforeTokenTransfer 的签名。

你必须这样做:

function _beforeTokenTransfer(
    address from,
    address to,
    uint256 firstTokenId,
    uint256 batchSize
) internal virtual override (ERC721, ERC721Enumerable, ERC721Pausable) {
    super._beforeTokenTransfer(from, to, firstTokenId, batchSize);
}

关于solidity - OpenZeppelin:类型错误:函数已指定覆盖但未覆盖任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75933374/

相关文章:

ethereum - 以太坊合约变量的初始值是多少?

solidity - 如何为 Solidity 中的函数设置默认参数

node.js - 我们可以在 NodeJS 中使用 Solidity 吗?

mysql - Angular - 在 Zeppelin 中将动态表单内容插入数据库

chainlink - 我正在尝试在 TRON 区 block 链上实现 openzeppelin 的最小代理克隆合约

visual-studio-code - VScode Solidity 扩展 - 找不到 openzepplin 导入

arguments - Solidity 混音 : passing multiple bytes32 type arguments

ethereum - NFT 可以用于 Web 应用程序的身份验证吗

ethereum - 如何检查地址是否是以太坊区 block 链上的现有地址?

javascript - erc20 认领 token 转移功能不起作用