針對 UniSwap v3 資金效率的分析

Steven Wu
imToken
Published in
12 min readSep 27, 2021

前言

Uniswap 在 v1 , v2 基本上一直是維持著 xy = k 的模型,但這種簡潔的模型有一個缺點:資金利用率,如果今天代幣的價格只在某個區內徘徊的話,對流動性提供者而言,其實有很大一部分的資金是用不到的, v3 提出了一個嶄新的解決辦法,透過曲線的平移,讓流動性提供者可以使用較少的資金在其自訂的價格區間內,提供跟 v2 相同的流動性 ( 簡單來說,就是使用者放相同數量的 ETH 進到兩個池子,都要拿到一樣數量的 USDT ),細節這邊就不展開了,有興趣的人可以直接看看 v3 白皮書 或者參考 這篇

本文主要是想探討,使用較少的資金確切是多少?也就是說,我們希望可以了解,在限定的價格區間中,假設在 v2 的流動性提供者提供了總價值 10000 USD 的資金,那麼在 v3 ,若想得到跟 v2 相同的流動性,他需要投入的資金量為何?

目標

根據下面這則 twitter ,Uniswap v3 跟 v2 的資金效率計算公式為:
1/(1-(a/b)^(1/4))
其中 a , b 分別為流動性提供者在 v3 選擇的價格區間的下界與上界 ( a < b )

圖1. Hayden Adams 為 v3 白皮書作者之一

依照這個式子,v3 跟 v2 的資金效率 ( capital efficiency , 以下稱 ce ) 只和 a ,b 有關,與提供流動性當時的現價無關,也就是說:

  1. 若 a , b 的值固定,則不論現價為何, ce 不變
  2. 若 a/b 和現價均固定,則不論實際上 a , b 為何, ce 不變

( 其實 1. 跟 2. 就是在 a , b 比值固定的情況下,分別討論現價固定與否,ce 是否變化 )

此則 twitter 並沒有仔細說明這個公式是怎麼來的,但就字面意思解釋,加上 Uniswap 在他們文章中提供的計算器 ( 在 capital efficiency 章節裡,往下拉一點就會看到 ),本文認為 ce 的算法應該是 v2 所需資金 / v3 所需資金。

正因為如此,既然要提供資金,那麼從直覺來看,現價應該會對 ce 有影響,譬如今天要提供的資金是 50 ETH 跟 1000 USDT,在 ETH 現價為 100 跟 3000 的時候,兩者的價值是不一樣的。當然也不排除,v3 所需資金和現價是有關連的,也就是說,現價對 ce 的影響可能會被抵消,所以會產生 twitter 式子的效果。

總而言之,帶著這樣的疑惑,本文會一步步思考,ce 應該怎麼算、ce 和現價有沒有關係。如果有,是什麼關係,是不是可以推導出另一個 ce 的式子?如果沒有,原因是什麼?

符號以及定義

符號

  • v3 跟 v2 的資金效率:ce
  • 使用者提供的價格區間:[ a , b ]
    — a < b
  • 提供流動性當時的現價:c
    — a < c < b ( 本文先考慮現價在區間內的情況 )
  • a , b , c 座標分別為:( xa , ya ) , ( xb , yb ) , ( xc , yc )
    — 為了排版美觀,本文就不另外加下標

定義

  • 本文考慮的代幣兌換池是 X token — Y token ( 可以想成 ETH — USDT )
  • 本文的價格均是表示 X token 的價格,並且以 Y token 計價 ( 若價格為 100,表示 1 個 X token 能換 100 個 Y token )

根據 v3 白皮書:

圖2. 截圖自 v3 白皮書p2.

請看圖片中最後一行,使用者實際提供的資金 ( reserves ) 為 x_real 和 y_real,若提供資金的當下價格為 c,代表使用者在 v3 提供的資金為 x_real * c + y_real ( 因為 y_real / x_real 不一定會等於 c ,所以不能直接表示成 2 * y_real )。

  • x_real = xr = xc-xb
  • y_real = yr = yc-ya
  • ce = v2 所需資金 / v3 所需資金
    — 在本文中,兩種資金皆以 Y token 計價

假設

本文有幾個重要假設

1). 使用者在 v2 提供的資金為 2*yc ( 因為在 v2 曲線上,任何一個點的 X token 和 Y token 的價值要相同,而本文的價格均是以 Y token 計價 )

2). 使用者在 v3 提供的資金為 xr * c + yr

3). Hayden Adams 在 twitter 的那個式子,想計算的東西就是本文的 ce

如果以上假設有任何一點不成立,則本文推論就沒有意義,但根據目前看到的資料 ( 白皮書、twitter、v3 計算器 ),應該可以認為這幾個假設是成立的。

Twitter 式子奇妙之處

接下來我們來看 twitter 的式子套用在前面提到的兩種情況。

1. 若 a , b 的值固定,則不論現價為何, ce 不變

圖3. a , b 固定時,考慮兩種現價 : c1 , c2
  • 直接代數字找反例

令 v2 曲線為:xy = 2500

b = 625 ( x : 2 , y : 1250 )

c2 = 25 ( x : 10 , y : 250 )

c1 = 1 ( x : 50 , y : 50 )

a = 1/4 ( x : 100 , y : 25 )

若 twitter 式子成立,代表流動性提供者在現價為 c1 和 c2 時,ce ( v2 所需資金 / v3 所需資金 ) 會是相同的

case1. ( 現價為 c1 = 1 ):

v2 所需資金 = 2 * 50 = 100

v3 所需資金 = xr * c1 + yr = (50–2) * 1 + (50–25) = 73

ce1 = 100 / 73 = 1.369863

case2. ( 現價為 c2 = 25 ):

v2 所需資金 = 2 * 250 = 500

v3 所需資金 = xr * c1 + yr = (10–2) * 25 + (250–25) = 425

ce2 = 500 / 425 = 1.764706

=> ce1 ≠ ce2 。

2. 若 a/b 和現價均固定,則不論實際上 a , b 為何, ce 不變

圖4. 固定 a,b 比值及現價 c,考慮不同 a,b
  • 直接代數字找反例

令 v2 曲線為:xy = 2073600

b1 = 1600 ( x : 36 , y : 57600 )

a1 = 100 ( x : 144 , y : 14400 )

b2 = 6400 ( x : 18 , y : 115200 )

a2 = 400 ( x : 72 , y : 28800 )

c = 1296 ( x:40 , y:51840 )

a1 / b1 = a2 / b2 = 1 / 16

case 1. ( a1 = 100 , b1 = 1600 ):

v2 所需資金 = 2 * 51840 = 103680

v3 所需資金 = xr * c + yr = (40–36 ) * 1296 + (51840–14400) = 42624

ce1 = 103680 / 42624 = 2.432432

case 2. ( a2 = 400 , b2 = 6400 ):

v2 所需資金 = 2 * 51840 = 103680

v3 所需資金 = xr * c + yr= (40–18 ) * 1296 + (51840–28800) = 51552

ce2 = 103680 / 51552 = 2.011173

=> ce1 ≠ ce2 。

note:以上兩種狀況均可以直接透過數學推導證明,也就是 ce 在 xc 改變時會跟著改變或者 ce 在 a ,b 改變時會跟著改變,礙於篇幅,數學推導就不寫下來了,有興趣的讀者可以使用 telegram 找我討論,之後也有可能會補充到另一篇文章。

計算 ce

上面我們舉出反例證明 twitter 式子不是通用的,接下來會推導我認為的 ce 計算方式。

一開始,我們先再次確認我們已知的部分

已知

ce = v2 所需資金 / v3 所需資金

v2 所需資金 = 2 * yc

v3 所需資金 = xr * c + yr

a = ya / xa
- 流動性提供者選擇的區間下界

b = yb / xb
- 流動性提供者選擇的區間上界

接下來,我們希望能夠盡量用 a , b , c 來表示出 ce 公式中會出現的符號 ( yc , xr , yr )

step 1.

  • xr = ( 1-sqrt(c/b) ) * xc

因為 b*xb^2 = c*xc^2
=> xb:xc = sqrt(c):sqrt(b)
=> xb / xc = sqrt(c) / sqrt(b) = sqrt(c/b)
=> xb = xc * sqrt(c/b)
=> xr = xc-xb = xc-xc * sqrt(c/b)=( 1-sqrt(c/b) ) * xc

step 2.

  • yr = ( 1 — sqrt(a/c) ) * yc

因為 ya^2 / a = yc^2 / c
=> ya:yc = sqrt(a):sqrt(c)
=> ya / yc = sqrt(a) / sqrt(c) = sqrt(a/c)
=> ya = yc * sqrt(a/c)
=> yr = yc-ya = yc-yc * sqrt(a/c) = ( 1 — sqrt(a/c) ) * yc

整理化簡之後,可得

圖5. ce

若 yr / xr = c

這個章節會說明,在 yr / xr = c 的情況下,ce 算出來的結果會跟 twitter 的式子相同,因此我們認為,twitter 的式子只是在這個情況下的一個特例。

note:這裡的式子比較多,閱讀起來可能會有一點點吃力,建議在看這部分推導時可以拿紙筆在旁邊跟著推導一次,或者也可以稍微違反去中心化的原則,直接選擇相信本文,然後拉到底部、按讚、訂閱、開啟小鈴鐺。

已知

  • sqrt(c/b) * xc = xb
    => sqrt(c/b) = xb / xc — — 式子(1)
  • sqrt(a/c) * yc = ya
    => sqrt(a/c) = ya / yc — — 式子(2)

式子(1) , (2) 的推導過程在上一段文章

  • xr = xc-xb — — 式子(3)
  • yr = yc-ya — — 式子(4)
  • yr / xr = c = yc / xc — — 式子(5)

step1.

圖6. 將式子(3),(4) 代入式子(5)
圖7. 左右交叉相乘
圖8. 等號左右消掉 xc*yc 並移項

將 圖8. 的式子移項之後可得: ya / xb = yc / xc = c — — 式子(6)

step2.

ce = v2 所需資金 / v3 所需資金

v2 所需資金為 2*yc

v3 所需資金 = xr * c + yr

且 yr / xr = c

可以推得 ce = 2*yc / (xr * (yr/xr)+ yr ) = yc / yr

又加上 yr = yc -ya

=> ce = yc / ( yc — ya ) — — 式子(7)

step3.

根據 式子(2) 可推得

ya:yc = sqrt(a):sqrt(c) — — 式子(8)

圖9. 將式子(8)代入式子(7)
圖10. 根據式子(6),將 c 改寫成 ya / xb 。並且將 a 寫成 ya / xa。
圖11. 上下同乘 sqrt(xa*xb/ya)

到目前為止,將 ce 改寫成 sqrt(xa) / ( sqrt(xa)-sqrt(xb) ) — — 式子(9)
接下來要說明如何將 twitter 的式子也改寫成式子(9)。

step4.

已知 ya / xa = a ,yb / xb = b

移項後可得 ya = a*xa 以及 yb = b*xb

且 K = xa*ya = xb*yb

可推得:a*xa^2 = b*xb^2

=> a / b = (xb / xa )^2
=> (a/b)^(1/4) = ((xb/xa)^2)^(1/4) = (xb/xa)^(1/2) — — 式子(10)

圖12. twitter 式子
圖13. 將式子(10)代入

最後,分子分母同乘 sqrt(xa) 即可得到式子(9)。因此,經過 Step 1 ~ 4,說明了,在 yr / xr = c 的情況下,ce 算出來的結果會跟 twitter 的式子相同。

事實上,還能證明, yr / xr = c 和 sqrt(a*b) = c 是若且唯若的關係,換句話說,也可以說只有在 a , b 是特別挑選的情況下 ( a , b 的幾何平均數是 c ),twitter 的式子才會成立。

note:若將 sqrt(ab) = c 的條件代入 ce = 2/(2-sqrt(c/b)-sqrt(a/c)) 的式子中,經過簡單化簡,也能夠得出 twitter 的那個式子。

結尾

能夠看到這邊,請先給自己一點掌聲,有耐心是一項值得鼓勵的美德,等等可以去買點炸雞來犒賞自己 ( 如果是直接往下滑的人,也去吃吧,追求效率也不是一件壞事 )。

到了該做結論的時候,還是要重複文章一開始提過的,本文的推論是建立在某些假設的基礎上進行,如果假設出了問題,推論就會直接垮掉。如果假設都沒錯,那麼我們可以宣稱:v2 , v3 資金效率 ( ce ) 和現價有關係。

圖14. ce 公式

而且,因為 ce 的定義是:v2 所需資金 / v3 所需資金。從這個公式也能清楚看出,v2 所需資金一定會大於 v3 所需資金 ( 因爲分子小於分母 ,所以 ce > 1 )。

另外,本文暫時只有考慮現價在 LP 所選的價格區間中間的情況 ( a < c < b ),Uniswap v3 其實也能允許 LP 選擇的價格區間不包含現價 (會分成 c < a < b 和 a < b < c ),在那兩種狀況下,ce 的公式也還是這個形式嗎?如果有下一篇文章的話,會針對這部分做探討,有興趣的讀者也可以自己先思考一下這個問題。

特別感謝 NIC Lin 以及 Cyan Ho 陪我重看了十幾次白皮書以及我們所有能找到的相關文章

--

--