其他
在创建 NFT 合约、市场或数字资产系统时实现…
当你需要创建 NFT 合约、构建 NFT 市场或实现数字资产系统时,用 OpenZeppelin 实现 ERC-721/ERC-1155、元数据、版税与铸造策略。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 53/100 ×0.15
适用场景
在创建 NFT 合约、市场或数字资产系统通用
解决思路
- 创建 ERC-721 合约时,继承 ERC721URIStorage、ERC721Enumerable、Ownable,并使用 Counters.Counter 管理 tokenId。
- 在 ERC-721 中定义 MAX_SUPPLY、MINT_PRICE、MAX_PER_MINT 常量,并在 mint 函数中校验数量、总供应量和支付金额。
- 在 ERC-721 的 mint 循环中递增 tokenId,调用 _safeMint 铸造,并用 _setTokenURI 设置每个 token 的 URI。
- 实现 generateTokenURI 返回 IPFS URI 或链上元数据,例如拼接 ipfs://QmHash/{tokenId}.json。
- 重写 _beforeTokenTransfer、_burn、tokenURI、supportsInterface 以解决多继承冲突并调用 super。
- 添加 withdraw 函数,使用 onlyOwner 限制,将合约余额转给 owner。
- 创建 ERC-1155 合约时继承 ERC1155 和 Ownable,并在构造函数中设置基础 URI 模板(如 ipfs://QmBaseHash/{id}.json)。
- 在 ERC-1155 中为每个 token id 维护 tokenSupply 和 maxSupply 映射,并在 mint 时校验不超过 maxSupply。
- 实现 ERC-1155 的 mintBatch,遍历 ids 和 amounts,逐个校验供应量后调用 _mintBatch。
- 实现 ERC-1155 的 burn,校验调用者是否为 from 本人或已获授权(isApprovedForAll),然后 _burn 并减少 tokenSupply。
- 链下元数据使用 IPFS JSON 格式,包含 name、description、image 和 attributes 数组;attributes 可含 trait_type、value、display_type、max_value。
- 链上元数据使用 Base64 编码 JSON,tokenURI 返回 data:application/json;base64,...,image 可内嵌 data:image/svg+xml;base64,...。
- 实现 EIP-2981 版税时继承 IERC2981,定义 royaltyRecipient 和 royaltyFee(基点,如 500 表示 5%)。
- 实现 royaltyInfo 返回 (royaltyRecipient, (salePrice * royaltyFee) / 10000)。
- 实现 setRoyalty 并限制 fee <= 1000(最高 10%),且仅 owner 可调用。
- 在 supportsInterface 中判断 interfaceId == type(IERC2981).interfaceId 或调用 super.supportsInterface。
- 更多详细模板和完整示例阅读 references/details.md 中的模式库。
适用边界 · 注意事项
- 不适用于非 EVM 链或非 Solidity 的 NFT 实现。
- 不适用于不需要 NFT 标准(如仅需简单所有权记录)的场景。
- 不适用于未引入 OpenZeppelin 合约库的项目。