---
# System prepended metadata

title: VRGDA 算法浅析

---

# VRGDA 算法浅析

> 本文将Paradigm的blog [VRGDA](https://www.paradigm.xyz/2022/08/vrgda)做了简单整理，如需了解更多细节，请阅读原文。

## 概述

[VRGDA](https://www.paradigm.xyz/2022/08/vrgda)全称是Variable Rate Gradual Dutch Auctions（可变速率渐进式荷兰拍卖），是Paradigm提出的一种代币发行机制。其目的是通过可定制的代币发行模型，实现渐进式荷兰拍的效果：当市场热度超出预期时，价格上涨；反之，当市场热度低于预期时，价格下跌；而当市场热度与预期一致时，其价格等于设定的目标价格。

在[Art Gobblers](https://artgobblers.com/)项目中，有两种NFT通过VRGDA方式进行拍卖：一种是Gobbler，其总量具有固定上限10,000个；另一种是Page，无总量上限。这两种代币发行速率如下图所示：

![](https://i.imgur.com/WDNCOES.png)

## 定义

### 函数

为了实现荷兰拍卖的效果，需要寻找一种价格 $p$ 与时间 $t$ 的函数，使得随着时间 $t$ 的增长，价格 $p$ 呈下降趋势。

有很多函数可以满足要求，如paradigm在[GDA文章](https://www.paradigm.xyz/2022/04/gda)中提到的：

$$
p_n(t) = k \cdot \alpha^n e^{-\lambda t} \tag{1}
$$

这里我们选择如下函数：

$$
p_n(t) = p_0 \cdot c^t \text{, 0 < c < 1} \tag{2}
$$

其中， $p_0$ 为起始价格，由于 $0 \lt c \lt 1$，因此随着时间 $t$ 增加，价格 $p_n$ 将小于 $p_0$。

假设 $c = 0.7$， $t$ 的时间单位为天，则其表示每天的价格为前一天的70%。

价格（纵轴）与时间（横轴）曲线如下图所示：

![](https://i.imgur.com/jpl7zL1.jpg)

### 参数

定义如下参数：

* $p_0$ - 目标价格，如果NFT按照计划的速度拍卖，即市场热度符合预期，则每个NFT都将以该价格卖出
* $k$ - 在单位时间内，如果没有NFT成交，则NFT价格按照该百分比递减
* $f(t)$ - 代币发行模型，在时间 $t$ 内，预计将有多少数量的NFT发行

我们使用 $1-k$ 替换公式（1）中的 $c$，可得：

$$
p_n(t) = p_0 \cdot (1-k)^t \tag{3}
$$

假设 $k=0.30$，$t$ 的时间单位为天，起始价格为 $p_0$，则表示如果没有成交，每天价格下降30%（为前一天的70%）。

### 代币模型

到目前为止，公式（3）已经实现了价格随时间下降的效果。

为了使价格能够反映市场热度，我们使用 $t - s_n$ 代替 $t$，即用一个由已拍卖代币数量 $n$ 定义的函数 $s_n$ 来控制 $t$。

我们希望 $s_n$ 能够实现以下效果：

1. 如果拍卖进度快于预期，则下一个NFT的起拍价格大于 $p_0$
2. 如果拍卖进度慢于预期，则下一个NFT的起拍价格小于 $p_0$
3. 如果拍卖进度等于预期，则下一个NFT的起拍价格等于 $p_0$

假设拍卖进度等于预期，我们可以得出：

$$
p_0 \cdot (1-k)^{t_n - s_n} = p_0 \tag{4}
$$

可知此时 $t_n = s_n$，因此 $s_n$ 可以看作时间与代币数量的函数，即代币数量与时间函数 $f(t)$ 的反函数：

$$
s_n = t_n = f^{-1}(n) \tag{5}
$$

其中，代币数量与时间函数 $f(t)$，即为代币发行模型。

因为 $0 \lt (1-k) \lt 1$，如果拍卖进度快于预期，则 $t < s_n$，即 $t - s_n < 0$，因此 $(1-k)^{t - s_n} \gt 1$，可知：$p_n \gt p_0$，即起拍价格大于 $p_0$；同理，如果拍卖进度慢于预期，则 $p_n \lt p_0$，即起拍价格小于 $p_0$。

特别地，当市场过热时，拍卖价格会急速上升，以降低市场热度，可以防止巨鲸批量拍卖。

这就实现了拍卖价格与市场热度相互作用。

### VRGDA公式

VRGDA最终公式如下：

$$
vrgda_n(t) = p_0(1-k)^{t - f^{-1}(n)} \tag{6}
$$

其中，

* $p_0$ - 目标价格
* $k$ - 每单位时间价格衰减百分比
* $f^{-1}(n)$ - 时间与代币数量的函数，即代币发行模型 $f(t)$ 的反函数
* $t$ - 起拍到当前的时间

## 常见的代币发行模型

接下来我们以几个常见的代币发行模型为例，介绍VRGDA算法。

### 线性

假设预期每天卖出 $r$ 个NFT，则代币数量与时间的函数（发行模型）为：

$$
f(t) = rt
$$

对应的曲线为：

![](https://i.imgur.com/cGPuFm4.png)

其反函数（时间与代币数量的函数）为：

$$
f^{-1}(n) = \frac{n}{r}
$$

代入公式（6）可得，线性发行速率的VRGDA公式为：

$$
{linear\_vrgda}_n(t) = p_0(1-k)^{t - \frac{n}{r}} \tag{7}
$$

### 平方根

假设预期第1个NFT在第1天卖出，第2个NFT在第4天卖出，第 $n$ 个NFT在 $n^2$ 天卖出，即代币数量与时间的函数为：

$$
f(t) = \sqrt{t}
$$

对应的曲线为：

![](https://i.imgur.com/khlcYWm.png)

其反函数为：

$$
f^{-1}(n) = n^2
$$

代入公式（6）可得：

$$
{sqrt\_vrgda}_n(t) = p_0(1-k)^{t - n^2} \tag{8}
$$

### 逻辑函数

逻辑斯蒂函数（[Logistic Function](https://en.wikipedia.org/wiki/Logistic_function)）是一种S型函数，简化定义为：

$$
l(t) = \frac{1}{1 + e^{-t}}
$$

其可将任意输入压缩到$(0,1)$的范围内，如图所示：

![](https://i.imgur.com/rt5gcu5.jpg)

我们可以使用逻辑函数作为具备总量上限的发行模型函数。

首先将函数沿纵坐标下移0.5（因为$t=0$时，$l(t)=0.5$），取 $t \gt 0$，则 $0 \lt l(t) \lt 0.5$，函数表示为：

$$
l(t) = \frac{1}{1 + e^{-t}} - 0.5 \text{, t > 0}
$$

假设我们希望代币总量为 $L - 1$，可将上述公式放大 $2L$，并引入一个时间乘数 $s$ 以控制发行速率，即可得到发行函数：

$$
f(t) = \frac{2L}{1 + e^{-st}} - L \text{, t > 0}
$$

当 $t = \frac{1}{s}$ 时，可得：

$$
\frac{f(\frac{1}{s})}{L} = \frac{2}{1 + e^{-1}} - 1 \approx 0.46
$$

因此可以选择 $s$ 为使得代币发行量达到总量的46%的时间。比如，如果希望100天以后发行量达到总量的46%，则 $\frac{1}{s} = 100$，因此 $s = \frac{1}{100} = 0.01$。

可计算 $f(t)$ 的反函数为：

$$
f^{-1}(n) = -\frac{ln(\frac{2L}{L + n} - 1)}{s}
$$

代入公式（6），可得到基于逻辑函数的VRGDA公式：

$$
logistic\_vrgda_n(t) = p_0(1-k)^{t + \frac{ln(\frac{2L}{L + n} - 1)}{s}} \tag{9}
$$

对应的代币发行曲线如下图所示：

![](https://i.imgur.com/V7rx5s9.png)

## Art Gobblers 中的 VRGDA

在 Art Gobblers 项目中，Gobbler和Page两种NFT使用VRGDA方式拍卖，其中：

* Gobbler使用逻辑函数作为发行模型，其总量上限为10,000个
* Page使用了逻辑函数和线性发行相结合的方式，在一定时间后切换到线性发行，其总量无上限

以Gobbler为例，我们看看[源码](https://github.com/artgobblers/art-gobblers)中是如何定义VRGDA拍卖相关参数的：

```solidity
constructor(
    // Mint config:
    bytes32 _merkleRoot,
    uint256 _mintStart,
    // Addresses:
    Goo _goo,
    Pages _pages,
    address _team,
    address _community,
    RandProvider _randProvider,
    // URIs:
    string memory _baseUri,
    string memory _unrevealedUri
)
    GobblersERC721("Art Gobblers", "GOBBLER")
    Owned(msg.sender)
    LogisticVRGDA(
        69.42e18, // Target price.
        0.31e18, // Price decay percent.
        // Max gobblers mintable via VRGDA.
        toWadUnsafe(MAX_MINTABLE),
        0.0023e18 // Time scale.
    )
```

这里只需关注最后几行：

* 69.42e18：即目标价格（起始价格）$p_0$
* 0.31e18：表示如果一天内没有拍卖成功，则价格变为前一天价格的 $1-0.31=69\%$
* MAX_MINTABLE：最大可拍卖数，即 $L - 1$（注意，不是 $L$）
* 0.0023e18：即时间乘数$s$，$\frac{1}{0.0023} \approx 435$ 表示预期在435天后拍卖出总量46%的代币，根据[gobbler的拍卖计划](https://docs.google.com/spreadsheets/d/1i8hYuWyAymjbwx54fA1HcEMEwfEEyluX4tPssOXoyf4/edit#gid=1608966566)，大概在第15个月（435天左右）达到拍卖量的46%。

## 总结

VRGDA提出了一种可定制代币模型的渐进式荷兰拍卖方式，让市场参与拍卖代币的定价。实际上该算法不仅可以应用在NFT拍卖中，也适用于ERC20代币拍卖。VRGDA算法本质上是一种AMM，通过算法动态调整市场价格。

## 参考文章

* Variable Rate GDAs: https://www.paradigm.xyz/2022/08/vrgda
* Gradual Dutch Auctions: https://www.paradigm.xyz/2022/04/gda
* Art Gobblers: https://www.paradigm.xyz/2022/09/artgobblers