You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从OpenZeppelin导入ERC1155Burnable失败及ERC1155MintBurn存疑求助

Solidity合约导入错误及解决方案

问题说明

  • 导入@openzeppelin-contracts/token/ERC1155/extensions/ERC1155Burnable.sol时触发找不到文件的错误
  • 收到使用ERC1155MintBurn的建议,但该合约在OpenZeppelin库中不存在

错误根源

  1. 导入路径拼写错误:包名应为@openzeppelin/contracts,而非@openzeppelin-contracts(多了一个连字符)
  2. 合约名称误解: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:46:12