从版本 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/