Alert Source Discuss
🚧 Stagnant Standards Track: ERC

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.