ERC1155 - 函数已指定覆盖但不覆盖任何内容

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

我试图在我的合约中重写 ERC1155 openzeppelin 标准中的

_update
方法来编写一些额外的逻辑,但编译器以某种方式抱怨
"Function has override specified but does not override anything"
,这是我的代码:

pragma solidity ^0.8.4;

import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";

contract MyContract is ERC1155, AccessControl {

...
function _update(address from, address to, uint256[] memory ids, uint256[] memory values) internal override {
        
        // my custom logic...
        
        super._update(from, to, ids, values);
    }
...

}

除了错误之外,它还显示 super._update 部分的第二个错误

Member "_update" not found or not visible after argument-dependent lookup in type(contract super MyContract)

那么看起来 MyContract 没有看到它继承的 ERC1155 函数?我试图理解它是如何工作的,但从未与继承一起工作过。我想知道当 _update 方法在 ERC1155 标准中标记为

internal virtual
时,我是否可以重写它。我真的可以重写内部函数吗?它会起作用吗?

inheritance solidity openzeppelin erc1155
1个回答
0
投票

所以问题出在两个不同版本的 Openzeppelin 存储库合约上。编译器自动导入旧的 0.8.0 版本,该版本根本不包含 _update 方法,而是使用 _beforeTokenTransfer 和 _afterTokenTransfer 挂钩。这些可能在 Openzeppelin github 存储库中提供的较新的 0.8.20 版本中被删除,我认为编译器总是导入最新版本。

所以这个问题有两种解决方案,要么覆盖 _beforeTokenTransfer (这就是我所做的),要么强制编译器导入较新的版本并覆盖 _update 方法。

我希望这对将来的人有帮助。编译器从不说谎。

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