Gradual Dutch Auctions

Eric Huang
Taipei Ethereum Meetup
6 min readSep 13, 2023

閱讀 Paradigm - GDA

TL;DR

Gradual Dutch Auctions (GDA) 原理是將一筆賣出分成一系列連續的荷蘭式拍賣 (Dutch auctions),荷蘭式拍賣是將物品從高價逐漸降價直到賣出的拍賣方式,過去 ICO 時期曾有過「售出的代幣總量固定,融資金額隨時間下降」的方式讓 usd per token 遞減,最終讓每個買家單一 token 以相同的價格購買。好處是最終每個人的價格會是一樣的,壞處是要等拍賣結束才能拿到幣。而 GDA 就剛好相反,可以讓投資人立刻拿到幣,但是就不能保證每個人的成本相同,不過連續的形式可以利用數學公式來計算批量購買的價格以節省 gas 消耗。
GDA 與 TWAMM 可以解決相似的問題,在市場上流動性不足時有效出售資產,但 GDA 不需要依賴流動性提供者提供流動性。

這篇將介紹兩種 GDA:

  1. Discrete GDA — 適合用來拍賣 NFT
  2. Continuous GDA — 適合用來拍賣 Token

Discrete GDA

案例

Alice 有一組總共 10 個 NFT 想要出售,將他們同捆在同一個 auctions 中也許不是一個好作法,因為買家並不一定想要購買全部的 NFT。
那比較好的作法是將這 10 個 NFT 分別啟動成一個 auction,讓市場為每個 NFT 找到適合的價格。
Discrete GDA 就是這種作法的延伸,還因為數學特性支持批量高效 (gas-efficient) 購買。

機制與實作

Discrete GDA 非常適合 NFT 因為出售的數量是以整數計算,對每個 NFT 都啟動一個 virtual auction,其中每個 acution 起始時間相同,但起始價格會隨著發起的 acution 數量增加,例如:

NFT 0 起始價格從 10 usd 開始
NFT 1 起始價格從 15 usd 開始
NFT 2 起始價格從 22.5 usd 開始

每個 acution 的後續的價格會隨者時間指數的衰減,例如:

經過 1 秒後
NFT 0 價格變成 4.06569659741 usd
NFT 1 價格變成 6.09854489611 usd
NFT 2 價格變成 9.14781734416 usd

單一 auction 在經過 t 時間的價格對應到下面的公式 Pn(t):

附上 Desmos 可以玩玩看!
  • n 表示 auction index
  • t 表示從 auction 開始到現在的時間
  • k 表示 auction 起始價格
  • α 表示 auction 起始價格隨發行數量增加的係數
  • λ 表示 衰減常數

有了上述的價格公式就可以推算出批量購買的公式,假設想要購買 q 個 NFT,會從最便宜的開始購買,也就是排在前面的 q 個 auction,如果當時經過 T 時候有 m 個 NFT 已經出售,那可以給出下面的加總公式 P(q) 算出共要花多少可以買下:

帶入單一 auction 價格的 Pn(T) 整理後:

附上 Desmos 可以玩玩看!

假設經過 1 秒後,NFT 0 已經賣出了,這時你想要買下兩個 NFT
總共需要花 (NFT 1) 6.098544896… + (NFT 2) 9.14781734416… ~= 15.2463622403 usd

看圖也許比較清楚,將想購買的數量 q 與總價 P(q) 做圖:

購買的數量 q 與總價 P(q) 的關係圖

有興趣的人可以看 Solidity 範例程式碼,是照公式結合 ERC721 做出批量販賣 (mint) 與價格查詢!

Continuous GDA

案例

Alice 現在想要出售他的 ERC-20 token,其中一項作法是使用上篇所敘述的 Discrete GDA 切分成整數量的 token 出售 (例如 1, 5, 10 顆…),但是 Alice 可能不想像 Discrete GDA 一樣在開始時就出售所有 token,而是例如 linear emission,像是每天釋出 360 顆 token。

除了 Discrete GDA 以外,Alice 可以選擇使用標準的 dutch auctions,不過這就會出現了個議題,究竟要選擇多長的時間或者說多少 token 來做為一個 auction 呢?可以是一天 360 token 一個 auction、可以是一小時 15 token 一個 auction,也可以是一分鐘 0.25 token 一個 auction,這邊就牽涉到買賣的價格影響與 gas 之間的權衡。

Continuous GDA 就很適合處理這個問題,將時間切分到趨近於 0,這相當於切分成無限多個 auction,每個 auction 賣出無限小數量的 token。利用數學的方式就可以計算出任意數量的購買且兼具 gas 效率。

機制與實作

Continuous GDA 可以 linear emission 的出售 token,每秒會多出售 1 token 為例,可以將其分成無限多個 virtual auction 出售並且每一個 auction 以相同的起始價格開始出售,例如:

起始價格為 10 usd per token
1 秒後為 6.06530659713 usd per token
2 秒後為 3.67879441171 usd per token
3 秒後為 2.23130160148 usd per token

單一 auction 在 t 時間的價格對應到下面的公式 p(t):

附上 Desmos 可以玩玩看!
  • t 表示從 auction 開始到現在的時間
  • k 表示 auction 起始價格
  • λ 表示 衰減常數

有了上述的價格公式就可以推算出批量購買的公式,假設想要購買 q 個 token 且 token 以 r 的速率 linear emission,那需要購買時間總共是 q / r 秒。

從價格最便宜的開始買起,假設現在還沒賣出且最早的 auction 距離現在 T 秒之前,那我們就可以推出購買 q 個 token 總共所需要的價錢為 P(q):

帶入單一 auction 的價格 p(t) 後推導出:

附上 Desmos 可以玩玩看!

假設經過 1 秒後且 r = 1,這時你想要買下 1.5 個 token
需要花 1 個已經可購買 -> 1 * p(1)
加上 0.5 個隨接下來時間購買 -> P(0.5)
總共 1 * 6.06530659713 + 3.44540246718 ~= 9.51070906431 usd

將想購買的數量 q 與總價 P(q) 做圖:

有興趣的人可以看 Solidity 範例程式碼,是照公式結合 ERC20 做出批量販賣 (mint) 與價格查詢!

結語

GDA 提供了一種新的方式來出售 non-fungible/fungible tokens,可以不用像 AMM 一樣依賴流動性提供者,而上面提供的公式是原作者提供其中一種可行與合約實作。

感謝 Ping Chen, Kevin Mai-Hsuan Chiahugebing 的 review 和提供意見!

參考資料

TEM Medium 2023 有獎徵稿

TEM Medium 目前正在進行有獎徵稿! 詳情請參考: https://medium.com/taipei-ethereum-meetup/tem-medium-call-for-papers-with-prize-2023-q1-f384828f902f

--

--