首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ERC 1155版税

ERC 1155版税
EN

Ethereum用户
提问于 2021-11-17 18:32:04
回答 2查看 3.3K关注 0票数 5

如何将版税包括在正常的ERC1155合同中?

就像这样:

代码语言:javascript
复制
// Import 1155 token contract from Openzeppelin

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol";

contract NFTContract is ERC1155, Ownable {
    
    uint256 public constant ARTWORK = 0;
    uint256 public constant PHOTO = 1;
    
    constructor() ERC1155("https://wzh58eid3jnd.usemoralis.com/{id}.json") {
        _mint(msg.sender, ARTWORK, 1, "");
        _mint(msg.sender, PHOTO, 2, "");
    }
    function mint( address to, uint256 id, uint256 amount) public onlyOwner {
        _mint(to, id, amount, "");
    }
    function burn( address from, uint256 id, uint256 amount) public {
        require(msg.sender == from);
        _burn(from, id, amount);
    }
}``` 
EN

回答 2

Ethereum用户

发布于 2021-11-17 22:17:57

简短回答:

  • 目前没有广泛采用的单一办法来实现这一目标。
  • 添加您认为需要的平台的版税功能(如OpenSea)。示例如下。

长答案

当涉及版税时,NFT世界是分裂的。

正如你在这里看到的,OpenSea似乎是通过允许您在元数据中包含版税信息来做到这一点的。

Rarible有一个独立的智能契约,称为特许权使用费登记处,用于跟踪每个NFT的版税。

各种互联网源建议在您的transferFrom()函数中添加自定义代码。然而,我建议不要像EIP-2981中提到的那样。

不可能知道哪些NFT传输是销售的结果,而哪些仅仅是移动或巩固其NFT的钱包。因此,我们不能强制每个传递函数,例如transferFrom()

谢天谢地,随着EIP-2981: NFT皇室标准最近获得批准,这种跨NFT空间的不一致性将有望改变。现在还为时尚早,但像敏表这样的一些市场已经实现了这一点,而且OpenSea也有公众支持这样做。

鉴于EIP-2981还没有得到更大市场的支持,我建议你:

  1. 添加您认为需要的平台的版税功能(如OpenSea)
  2. 通过实施EIP-2981成为未来的证明。

考虑到您提供的信息,下面是如何同时支持EIP-2981和OpenSea的示例。我从这个回购复制了一些代码。

代码语言:javascript
复制
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';


interface IERC2981Royalties {
    
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981Base is ERC165, IERC2981Royalties {
    struct RoyaltyInfo {
        address recipient;
        uint24 amount;
    }

    /// @inheritdoc ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

contract NFTContract is ERC1155, Ownable, ERC2981Base {
    
    uint256 public constant ARTWORK = 0;
    uint256 public constant PHOTO = 1;
    RoyaltyInfo private _royalties;
    
    constructor() ERC1155("https://wzh58eid3jnd.usemoralis.com/{id}.json") {
        _setRoyalties({YOUR ADDRESS HERE} , {ROYALTY PERCENTAGE IN BASIS POINTS});
        _mint(msg.sender, ARTWORK, 1, "");
        _mint(msg.sender, PHOTO, 2, "");
    }
    
    // This is just for OpenSea to find your metadata containing the royalties. 
    // This metadata is about the contract and not the individual NFTs
    function contractURI() public view returns (string memory) {
        return "https://metadata-url.com/my-metadata";
    }
    
    function mint( address to, uint256 id, uint256 amount) public onlyOwner {
        _mint(to, id, amount, "");
    }
    function burn( address from, uint256 id, uint256 amount) public {
        require(msg.sender == from);
        _burn(from, id, amount);
    }
    
    
    // Value is in basis points so 10000 = 100% , 100 = 1% etc
    function _setRoyalties(address recipient, uint256 value) internal {
        require(value <= 10000, 'ERC2981Royalties: Too high');
        _royalties = RoyaltyInfo(recipient, uint24(value));
    }


    function royaltyInfo(uint256, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        RoyaltyInfo memory royalties = _royalties;
        receiver = royalties.recipient;
        royaltyAmount = (value * royalties.amount) / 10000;
    }
    
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981Base) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
    
}

对于OpenSea的契约元数据,它可能如下所示:

代码语言:javascript
复制
{
  "name": "NFT Contract",
  "description": "Really cool description about my art",
  "image": "https://openseacreatures.io/image.png", # Link to collection image
  "external_link": "https://openseacreatures.io", # Link to website
  "seller_fee_basis_points": 100, # Indicates a 1% seller fee.
  "fee_recipient": "0xA97F337c39cccE66adfeCB2BF99C1DdC54C2D721" # Where seller fees will be paid to.
}
票数 8
EN

Ethereum用户

发布于 2022-01-22 00:01:20

完全同意这里的第一个答案。最好的选择是在您的合同中实现EIP 2981,即使还不受支持,还可以向OpenSea提供您的版税信息。修改传输函数可能会阻止exchanges正确列出您的集合。

注意:您可以在导入集合后手动更新OpenSea中的版税信息,而不是将其包含在契约级别的URI中。如果您希望保持一些灵活性,而不是永久地在JSON中设置收件人/级别,则与此相关。

除了版税之外,OpenSea还建议在精简集合列表中添加一些小的内容,比如白名单、元事务、契约级URI、令牌级URI覆盖等等。

这个回购包含了ERC1155实现的所有智能合同,包括EIP 2981版税、OpenSea建议的添加以及令牌/版本供应的额外硬限制(可以删除)。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/113793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档