ERC-5633: 可组合的 Soulbound NFT,EIP-1155 扩展
向 EIP-1155 token 添加可组合的 soulbound 属性
Authors | HonorLabs (@honorworldio) |
---|---|
Created | 2022-09-09 |
Discussion Link | https://ethereum-magicians.org/t/composable-soulbound-nft-eip-1155-extension/10773 |
Requires | EIP-165, EIP-1155 |
摘要
此标准是 EIP-1155 的扩展。它提出了一个智能合约接口,可以表示任意数量的 soulbound 和非 soulbound NFT 类型。Soulbound 是指 token 的一种属性,可以防止 token 在账户之间转移。此标准允许每个 token ID 拥有自己的 soulbound 属性。
动机
类似于《魔兽世界》中 soulbound 物品的 soulbound NFT 正在以太坊社区中引起越来越多的关注。在像《魔兽世界》这样的真实游戏中,有成千上万的物品,每个物品都有自己的 soulbound 属性。例如,护身符“卡莉西亚项链”具有 soulbound 属性,但另一个低等级的护身符则没有。此提案提供了一种标准的方法来表示可以与非 soulbound NFT 共存的 soulbound NFT。在一个合约中为一个完整的集合设计可组合的 NFT 很容易。
此标准概述了一个 EIP-1155 接口,允许钱包实现者和开发者使用 EIP-165 检查 token ID 的 soulbound 属性。可以提前检查 soulbound 属性,并且只有在 token 不是 soulbound 时才能调用 transfer 函数。
规范
本文档中的关键词“必须(MUST)”、“禁止(MUST NOT)”、“必需(REQUIRED)”、“应(SHALL)”、“不应(SHALL NOT)”、“应该(SHOULD)”、“不应该(SHOULD NOT)”、“推荐(RECOMMENDED)”、“可以(MAY)”和“可选(OPTIONAL)”应按照 RFC 2119 中的描述进行解释。
如果函数 isSoulbound(uint256 id)
返回 true,则具有 uint256 id
的 token 类型是 soulbound。在这种情况下,合约中所有将 token 从一个帐户转移到另一个帐户的 EIP-1155 函数都必须抛出异常,除了 mint 和 burn。
// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.0;
interface IERC5633 {
/**
* @dev 当 token 类型 `id` 设置或取消为 soulbound 时,根据 `bounded` 发出事件。
*/
event Soulbound(uint256 indexed id, bool bounded);
/**
* @dev 如果 token 类型 `id` 是 soulbound,则返回 true。
*/
function isSoulbound(uint256 id) external view returns (bool);
}
实现此标准的智能合约必须实现 EIP-165 supportsInterface 函数,并且如果通过 interfaceID 参数传递 0x911ec470,则必须返回常量值 true。
理由
如果合约中的所有 token 默认都是 soulbound,则在实现过程中,isSoulbound(uint256 id)
应该默认返回 true。
向后兼容性
此标准与 EIP-1155 完全兼容。
测试用例
测试用例包含在 test.js 中。
在终端中运行:
cd ../assets/eip-5633
npm install
npx hardhat test
测试合约包含在 ERC5633Demo.sol
中。
参考实现
请参阅 ERC5633.sol
。
安全考虑
没有与此标准的实现直接相关的安全考虑。
版权
通过 CC0 放弃版权和相关权利。
Citation
Please cite this document as:
HonorLabs (@honorworldio), "ERC-5633: 可组合的 Soulbound NFT,EIP-1155 扩展 [DRAFT]," Ethereum Improvement Proposals, no. 5633, September 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5633.