我试图在我的合约中重写 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
时,我是否可以重写它。我真的可以重写内部函数吗?它会起作用吗?
所以问题出在两个不同版本的 Openzeppelin 存储库合约上。编译器自动导入旧的 0.8.0 版本,该版本根本不包含 _update 方法,而是使用 _beforeTokenTransfer 和 _afterTokenTransfer 挂钩。这些可能在 Openzeppelin github 存储库中提供的较新的 0.8.20 版本中被删除,我认为编译器总是导入最新版本。
所以这个问题有两种解决方案,要么覆盖 _beforeTokenTransfer (这就是我所做的),要么强制编译器导入较新的版本并覆盖 _update 方法。
我希望这对将来的人有帮助。编译器从不说谎。