如何将版税包括在正常的ERC1155合同中?
就像这样:
// 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);
}
}``` 发布于 2021-11-17 22:17:57
当涉及版税时,NFT世界是分裂的。
正如你在这里看到的,OpenSea似乎是通过允许您在元数据中包含版税信息来做到这一点的。
Rarible有一个独立的智能契约,称为特许权使用费登记处,用于跟踪每个NFT的版税。
各种互联网源建议在您的transferFrom()函数中添加自定义代码。然而,我建议不要像EIP-2981中提到的那样。
不可能知道哪些NFT传输是销售的结果,而哪些仅仅是移动或巩固其NFT的钱包。因此,我们不能强制每个传递函数,例如
transferFrom()。
谢天谢地,随着EIP-2981: NFT皇室标准最近获得批准,这种跨NFT空间的不一致性将有望改变。现在还为时尚早,但像敏表这样的一些市场已经实现了这一点,而且OpenSea也有公众支持这样做。
鉴于EIP-2981还没有得到更大市场的支持,我建议你:
考虑到您提供的信息,下面是如何同时支持EIP-2981和OpenSea的示例。我从这个回购复制了一些代码。
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的契约元数据,它可能如下所示:
{
"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.
}发布于 2022-01-22 00:01:20
完全同意这里的第一个答案。最好的选择是在您的合同中实现EIP 2981,即使还不受支持,还可以向OpenSea提供您的版税信息。修改传输函数可能会阻止exchanges正确列出您的集合。
注意:您可以在导入集合后手动更新OpenSea中的版税信息,而不是将其包含在契约级别的URI中。如果您希望保持一些灵活性,而不是永久地在JSON中设置收件人/级别,则与此相关。
除了版税之外,OpenSea还建议在精简集合列表中添加一些小的内容,比如白名单、元事务、契约级URI、令牌级URI覆盖等等。
这个回购包含了ERC1155实现的所有智能合同,包括EIP 2981版税、OpenSea建议的添加以及令牌/版本供应的额外硬限制(可以删除)。
https://ethereum.stackexchange.com/questions/113793
复制相似问题