ERC-4521: 721/20兼容的转账
推荐一个简单的扩展,使NFT与处理同质化代币的应用程序和合约兼容。
Authors | Ross Campbell (@z0r0z) |
---|---|
Created | 2021-12-13 |
Discussion Link | https://ethereum-magicians.org/t/eip-4521-721-20-compatible-transfer/7903 |
Requires | EIP-721 |
摘要
ERC-721,作为非同质化代币(NFT)的流行标准,包括发送函数,如transferFrom()
和safeTransferFrom()
,但不包括同质化ERC-20代币中常见的向后兼容的transfer()
。此标准提供了添加此类transfer()
的参考。
动机
此标准提出了一种简单的扩展,允许NFT与设计用于管理ERC-20的合约以及许多期望能够执行代币transfer()
的消费者钱包一起使用。例如,如果NFT不慎发送到通常处理ERC-20的合约,则该NFT将被锁定。如果合约程序员可以依靠transfer()
来同时处理ERC-20和NFT,也应该简化他们的任务。
规范
本文档中的关键词“MUST”,“MUST NOT”,“REQUIRED”,“SHALL”,“SHALL NOT”,“SHOULD”,“SHOULD NOT”,“RECOMMENDED”,“MAY”和“OPTIONAL”应按照 RFC 2119 中的描述进行解释。
ERC-4521 transfer()
的接口必须符合 ERC-20,并且由此产生的转移必须触发 ERC-721 中描述的 Transfer
事件。
function transfer(address to, uint256 tokenId) external returns (bool success);
理由
复制 ERC-20 transfer()
,只需进行细微更改以准确反映发送的是唯一的 tokenId
而不是同质化的总和,这对于代码的简洁性和简化集成是可取的。
向后兼容性
此 EIP 没有引入任何已知的向后兼容性问题。
参考实现
ERC-4521 transfer()
的参考实现:
function transfer(address to, uint256 tokenId) public virtual returns (bool success) {
require(msg.sender == ownerOf[tokenId], "NOT_OWNER");
unchecked {
balanceOf[msg.sender]--;
balanceOf[to]++;
}
delete getApproved[tokenId];
ownerOf[tokenId] = to;
emit Transfer(msg.sender, to, tokenId);
success = true;
}
安全考虑
为了符合使用 ERC-20 接口的现有合约,实施者必须确保包含 ERC-4521 的相关返回 bool
值,否则,除非在此类合约中使用 safeTransfer
,否则 NFT 可能会被锁定。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Ross Campbell (@z0r0z), "ERC-4521: 721/20兼容的转账 [DRAFT]," Ethereum Improvement Proposals, no. 4521, December 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-4521.