# ERC721R: 保护用户，防止NFT创作者跑路，但是有漏洞

By [3WebDAO](https://paragraph.com/@3webcapital) · 2022-04-13

---

\*\* \[关于3WebDAO\]\*\*

**3WebDAO**是一个去中心化的区块链洞察平台，它结合了研究报告和链上数据指标为数字资产利益相关者服务；愿景是帮助独角兽落地和Web3投资者获利。

![](https://storage.googleapis.com/papyrus_images/d812929cc53840160c605f0ac61720cf6b0414b482a918f4932635a406ff0a98.png)

背景
==

前不久我们研究分析了[《从APE空投看无聊猿BAYC的起飞之路》](http://mp.weixin.qq.com/s?__biz=Mzg3MjY3NDMxMg==&mid=2247484463&idx=1&sn=c5a9fa5165836a9e73323c332e2c1935&chksm=ceeae148f99d685e2180a0bed7e35dc7d2c26294ed97c77702478cbca11b7e165e016591ee98&scene=21#wechat_redirect)，时至今日2022年4月12日，BAYC系列价格依旧保持坚挺，地板价在110 ETH左右。

但是，不得不承认的是当前NFT处于非常早期的阶段，也是遇到了历史阶段性的瓶颈。

具体表现在以下三个方面：

1、NFT项目两级分化非常严重，顶流的NFT项目市值越来越高；去年很多价格被资本市场推得很高的JPG项目如今也基本跌去了90%以上。

2、除了有小部分是基于IP背景下的社交、收藏属性之外，应用场景是相当欠缺，貌似除了炒作之外没有太多实际应用。

3、我们都知道NFT是非同质化代币, 现在NFT的同质化趋势也越来越明显。

所以在此背景下，一旦NFT赚钱效应不再，NFT市场也日渐内卷。更糟糕的是，出现了越来越多的Rug Pulls项目。关于Rug Pulls，原意为拉地毯，延伸意为加密产业中常见的卷款遣逃事件，经常发生于Defi协议中，现在也发生在NFT项目中，项目方让用户以某个价格Mint得某个NFT，然后把所得的钱财卷走跑路 。

**怎么避免这种情况出现呢？**

就在昨天2022年4月11日，有开发者发布了ERC721(以太坊NFT的标准)的补充标准ERC721R。详情可见：[https://erc721r.org/](https://erc721r.org/)

什么是ERC721R
==========

ERC721R 为 NFT 智能合约添加了无需信任的退款，用户成功Mint得NFT后支付的ETH暂时保存在合约中，允许用户在成功Mint得NFT之后的一段时间内（比如7天，由NFT创作者自行设定，称为退款期）发起退款，用户把NFT资产退还给创作者，创作者合约会自动返还用户成本Mint得 NFT支付的ETH, Gas费无法退还。

退款机制是怎么实现的？
===========

首先，得益于区块链智能合约的去中心化特性，在传统Web2.0由于利益关系很难实现的功能在智能合约中可用简洁的代码段就能轻松实现。

**直接上代码展示+注释**，NFT创作者可以直接将以下代码段添加到智能合约中就考研题添加退款功能：

`//退款期，由NFT创作者自己设置（个人觉得由NFT创作者设置不太合理）`

`uint256 public constant refundPeriod = 45 days;`

`//退款期截止时间 uint256 public refundEndTime;`

`//创作者用于接收退款NFT的地址 address public refundAddress;`

`//构造函数，合约部署时自动执行一遍`

`constructor() ERC721A("ERC721RExample", "ERC721R") { refundAddress = msg.sender; toggleRefundCountdown(); }`

`//判断是否在退款期内`

`function refundGuaranteeActive() public view returns (bool) { return (block.timestamp <= refundEndTime); }`

\`//用户发起退款操作调用的方法function refund(uint256\[\] calldata tokenIds) external { //判断在退款期内才执行后续功能require(refundGuaranteeActive(), "Refund expired");

    //循环把用户需要退给创作者合约的NFT退给合约`
    

`for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; //判断此NFT属于此用户`

`require(msg.sender == ownerOf(tokenId), "Not token owner"); //用户把NFT退还给创作者用于接收退款NFT地址的过程 transferFrom(msg.sender, refundAddress, tokenId); } //计算合约需要退给用户的退款金额`

`uint256 refundAmount = tokenIds.length * mintPrice; //合约执行退ETH给用户的过程`

`Address.sendValue(payable(msg.sender), refundAmount); }`

`//计算退款期截止时间`

`function toggleRefundCountdown() public onlyOwner { refundEndTime = block.timestamp + refundPeriod; }`

`//创作者设置修改用于接收退款NFT的地址`

`function setRefundAddress(address _refundAddress) external onlyOwner { refundAddress = _refundAddress; }`

ERC721R的作用
==========

### 防止Rug Pulls

如果您在薄荷糖后有 30 天的时间要求退款，这将阻止艺术家未按承诺交付的快速地毯拉动。

### 更大的责任感

看看创作者承诺的艺术，看看他们在退款期间如何处理社区。

### 受保护的地板价

因为用户可以在退款期内的任意时间发起退款，所以NFT创作者没有理由在退款期间以低于Mint的价格出售NFT。这也直接给Mint价格托底。

### 降低购买风险

如果买家不喜欢项目的进展，他们可以退回 NFT 并获得退款。

存在的不足和风险
========

NFT创作者可能设置极短的退款期
----------------

从上面的分析我们不难看出退款期是由NFT创作者自己设置的，对于设置较长时间（15天+）的合约，作为用户确实风险不大，因为用户有足够长的时间决定要不要退款。但是对于设置极短时间（比如1分钟）的合约，用户可能在想要退款的时候很快就错过了退款时间而无法完成退款。所以目前关于退款期的设置仍是不合理的，至于由谁如何设定仍值得讨论，个人认为起码不能小于1天，要不然仍无法避免设置10mins的Rug Pulls的项目出现。

合约中可能没有足够的ETH退给用户
-----------------

ERC721R标准中没有关于存在合约中将用于退还给用户的ETH余额的规定，很有可能存在合约中ETH余额不足的情况。若出现合约中余额不足，用户发起退款也将无法成功。然而这部分标准其实比较难实现，需要实现将用户支付的Mint费用在退款期间暂时冻结起来才能有效保证成功退款的可能。 另外合约中有一个接收你退款后的nft的地址,这个地址可以拿你退款的nft再到合约里来循环退款,这样就可以把合约中的eth掏空,项目方仍然可以rug pull

目前支持ERC721R的项目
==============

*   **Exodia Analytics**
    
    NFT 分析、投资组合跟踪器和 alpha 社区。
    
*   **Curious Addys' Trading Club**
    

    一款旨在让学习 NFT 和加密货币变得有趣且轻松的游戏。

*   **CryptoFighters Alliance**
    
    2018 年游戏赚钱经典
    
*   **Podium**
    
    内容创建者的启动器
    

One More Thing
==============

前面我们讲到NFT当下面临的瓶颈等问题，NFT的趋势总体和当年的ico是差不多的，从无人知晓到人声鼎沸时的巨大泡沫，泡沫被击穿后筛选出一批优秀和真正做事的项目和团队，然后慢慢地就会有越来越多的NFT应用场景的出现。

未来NFT将会在NFT + Finance, NFT碎片化，NFT+GameFi、元宇宙、音乐创意类等赛道出现独角兽。下一次我们就讲讲这些赛道里面值得关注的项目，**欢迎长按扫描下方公众号关注。可点击消息框右下角加入社区一起讨论。**

![](https://storage.googleapis.com/papyrus_images/96c0306d22bdc33bcfc56c9172b3f7e42ef9591029ecae9a89368d8dd8953f96.png)

---

*Originally published on [3WebDAO](https://paragraph.com/@3webcapital/erc721r-nft)*
