# ERC721R ，一个可以退款的 ERC721 标准

By [xyyme.eth](https://paragraph.com/@xyyme) · 2022-04-11

---

今天在推特上看到好多人都在说一个新的标准叫 ERC721R，可以给用户退款，防止 rug。抽了点时间看了看，其实代码也很简单，简单写篇文章介绍一下（[官网](https://erc721r.org/)，[GitHub](https://github.com/exo-digital-labs/ERC721R)）。

### 概述

现在有好多项目方，发完图捞一笔之后就跑路了，而参与 mint 的用户都成了接盘侠。ERC721R 的目的就是让用户可以在 mint 之后的一段时间内，有后悔药吃，可以用 mint 到的 NFT 以原价换回自己的币。这对于用户来说是一个很好的规则。来看看官方文档对于自己的优点说明：

> 对于买家来说：
> 
> *   购买风险低（最差的情况也可以换回自己的币）
>     
> *   防止 rug pull
>     
> *   强迫项目方能够好好做事
>     
> 
> 对于项目方来说：
> 
> *   能够在消费者心中建立对自己的信心
>     
> 
> 对于两者都有的有点：
> 
> *   当处于退款期间时，项目的地板价不会低于 mint 的价格（因为可以反向刚兑）
>     
> *   短期炒作者会早早离开项目，便于项目长期发展
>     

### 代码

数据结构：

    // 退款时间区间
    uint256 public constant refundPeriod;
    // 退款结束时间
    uint256 public refundEndTime;
    // 退款接收地址
    address public refundAddress;
    

合约函数：

当用户在退款期内想要退款时，可以调用 `refund` 函数，传入想要退款的 `tokenId` 列表，就可以将 NFT 换成币。

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

管理员在退款期内，不能转出币（以实现用户可以刚兑）。到期后可以转出。

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

### 总结

ERC721R 的代码还是很简单的，只是加了几个字段和对应的函数。虽然我个人觉得可能没啥用处，但是毕竟也是一个技术创新，值得支持。

### bug

这个合约有一个 bug，就是 `refundAddress` 可以用一个 `tokenId` 无限次退款，把钱都给套出来。这个 bug 我开始写文章的时候没有注意，后面看到了崔棉大师的[推特](https://twitter.com/MasterCui/status/1513813254040358913?s=20&t=jE5q2Y_UWzQSIXOxln9sFA)，发现确实是这样。

目前我想到的解决方法有两种：

*   退款的时候直接将对应的 `tokenId` burn 掉
    
*   建立一个 `mapping(tokenId => 是否退款 bool)`，来限制一个 tokenId 只能退款一次
    

这两种方法的目的都是限制一个 tokenId 只能退款一次。

不过当你看到这篇文章的时候，可能 bug 已经被修复了～

### 参考

[

GitHub - exo-digital-labs/ERC721R
---------------------------------

Contribute to exo-digital-labs/ERC721R development by creating an account on GitHub.

https://github.com

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

](https://erc721r.org/)

[

GitHub - exo-digital-labs/ERC721R
---------------------------------

Contribute to exo-digital-labs/ERC721R development by creating an account on GitHub.

https://github.com

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

](https://github.com/exo-digital-labs/ERC721R)

---

*Originally published on [xyyme.eth](https://paragraph.com/@xyyme/erc721r-erc721)*
