从OpenZeppelin导入ERC1155Burnable失败及ERC1155MintBurn存疑求助
Solidity合约导入错误及解决方案
问题说明
- 导入
@openzeppelin-contracts/token/ERC1155/extensions/ERC1155Burnable.sol时触发找不到文件的错误 - 收到使用
ERC1155MintBurn的建议,但该合约在OpenZeppelin库中不存在
错误根源
- 导入路径拼写错误:包名应为
@openzeppelin/contracts,而非@openzeppelin-contracts(多了一个连字符) - 合约名称误解:OpenZeppelin官方库中没有
ERC1155MintBurn这个合约;另外ERC1155Metadata也无需额外继承,因为基础ERC1155合约已包含元数据相关逻辑
修复方案
1. 修正导入路径
将错误的导入语句:
import "@openzeppelin-contracts/token/ERC1155/extensions/ERC1155Burnable.sol";
替换为正确路径:
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";
2. 清理无效的合约继承
从合约继承列表中移除ERC1155MintBurn和ERC1155Metadata,修正后的继承结构为:
contract Monion1155 is ERC1155, Ownable, Pausable, ERC2981, ERC1155Supply, ERC1155Holder, ERC1155Burnable {
3. 实现接口支持
由于ERC2981是独立合约,需要重写supportsInterface函数来声明对该接口的支持,添加以下代码:
function supportsInterface(bytes4 interfaceId) public view override(ERC1155, ERC2981, ERC1155Holder) returns (bool) { return super.supportsInterface(interfaceId); }
4. 添加铸造逻辑
OpenZeppelin的ERC1155默认不提供公开铸造函数,需自行实现(示例为仅所有者可调用):
function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) public onlyOwner whenNotPaused { _mint(to, tokenId, amount, data); emit Minted(tokenId, to, amount); }
5. 补充必要的重写函数
继承ERC1155Supply和Pausable后,需重写_beforeTokenTransfer并集成 pausable 逻辑:
function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal whenNotPaused override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); }
完整修正后的合约头部示例
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol"; import "./AdminContract.sol"; import "@openzeppelin/contracts/token/common/ERC2981.sol"; import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol"; import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; /** - Contract uses a single URI which is the monion IPFS URI for hosting metadata - Contract relies on the metadata to store relevant info about the token such as name, description etc. - Contract issues tokenId to each token minted - Contract use is cheaper than if the user deployed a fresh instance of the ERC1155 */ contract Monion1155 is ERC1155, Ownable, Pausable, ERC2981, ERC1155Supply, ERC1155Holder, ERC1155Burnable { event Minted (uint indexed tokenId,address indexed owner, uint quantity); address operator; AdminConsole admin; constructor(string memory uri) ERC1155(uri) {} function supportsInterface(bytes4 interfaceId) public view override(ERC1155, ERC2981, ERC1155Holder) returns (bool) { return super.supportsInterface(interfaceId); } function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) public onlyOwner whenNotPaused { _mint(to, tokenId, amount, data); emit Minted(tokenId, to, amount); } function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal whenNotPaused override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } }
内容的提问来源于stack exchange,提问作者S M
相关产品推荐
相关产品推荐

