前言
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 )
依照這個式子,v3 跟 v2 的資金效率 ( capital efficiency , 以下稱 ce ) 只和 a ,b 有關,與提供流動性當時的現價無關,也就是說:
- 若 a , b 的值固定,則不論現價為何, ce 不變
- 若 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 白皮書:
請看圖片中最後一行,使用者實際提供的資金 ( 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 不變
- 直接代數字找反例
令 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 不變
- 直接代數字找反例
令 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
整理化簡之後,可得
若 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.
將 圖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)
到目前為止,將 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)
最後,分子分母同乘 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 ) 和現價有關係。
而且,因為 ce 的定義是:v2 所需資金 / v3 所需資金。從這個公式也能清楚看出,v2 所需資金一定會大於 v3 所需資金 ( 因爲分子小於分母 ,所以 ce > 1 )。
另外,本文暫時只有考慮現價在 LP 所選的價格區間中間的情況 ( a < c < b ),Uniswap v3 其實也能允許 LP 選擇的價格區間不包含現價 (會分成 c < a < b 和 a < b < c ),在那兩種狀況下,ce 的公式也還是這個形式嗎?如果有下一篇文章的話,會針對這部分做探討,有興趣的讀者也可以自己先思考一下這個問題。