本文将Paradigm的blog VRGDA做了简单整理,如需了解更多细节,请阅读原文。
VRGDA全称是Variable Rate Gradual Dutch Auctions(可变速率渐进式荷兰拍卖),是Paradigm提出的一种代币发行机制。其目的是通过可定制的代币发行模型,实现渐进式荷兰拍的效果:当市场热度超出预期时,价格上涨;反之,当市场热度低于预期时,价格下跌;而当市场热度与预期一致时,其价格等于设定的目标价格。
在Art Gobblers项目中,有两种NFT通过VRGDA方式进行拍卖:一种是Gobbler,其总量具有固定上限10,000个;另一种是Page,无总量上限。这两种代币发行速率如下图所示:
为了实现荷兰拍卖的效果,需要寻找一种价格 \(p\) 与时间 \(t\) 的函数,使得随着时间 \(t\) 的增长,价格 \(p\) 呈下降趋势。
有很多函数可以满足要求,如paradigm在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%。
价格(纵轴)与时间(横轴)曲线如下图所示:
定义如下参数:
我们使用 \(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\) 能够实现以下效果:
假设拍卖进度等于预期,我们可以得出:
\[ 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_n(t) = p_0(1-k)^{t - f^{-1}(n)} \tag{6} \]
其中,
接下来我们以几个常见的代币发行模型为例,介绍VRGDA算法。
假设预期每天卖出 \(r\) 个NFT,则代币数量与时间的函数(发行模型)为:
\[ f(t) = rt \]
对应的曲线为:
其反函数(时间与代币数量的函数)为:
\[ 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} \]
对应的曲线为:
其反函数为:
\[ f^{-1}(n) = n^2 \]
代入公式(6)可得:
\[ {sqrt\_vrgda}_n(t) = p_0(1-k)^{t - n^2} \tag{8} \]
逻辑斯蒂函数(Logistic Function)是一种S型函数,简化定义为:
\[ l(t) = \frac{1}{1 + e^{-t}} \]
其可将任意输入压缩到\((0,1)\)的范围内,如图所示:
我们可以使用逻辑函数作为具备总量上限的发行模型函数。
首先将函数沿纵坐标下移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} \]
对应的代币发行曲线如下图所示:
在 Art Gobblers 项目中,Gobbler和Page两种NFT使用VRGDA方式拍卖,其中:
以Gobbler为例,我们看看源码中是如何定义VRGDA拍卖相关参数的:
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.
)
这里只需关注最后几行:
VRGDA提出了一种可定制代币模型的渐进式荷兰拍卖方式,让市场参与拍卖代币的定价。实际上该算法不仅可以应用在NFT拍卖中,也适用于ERC20代币拍卖。VRGDA算法本质上是一种AMM,通过算法动态调整市场价格。
or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing