本文屬於老雅痞原創文章,轉載規矩不變,給我們打聲招呼~
轉載請微信聯繫:huangdiezi,更多DAO、Web3、NFT、元宇宙資訊,請關注公眾號FastDaily
導讀
今日老雅痞共推送3篇文章。
本文主要是教你如何核算Uniswap V3中的費用。
如果你對使用NFT對房地產進行所有權代幣化的新嘗試感興趣,推薦閱讀第一條,是我們的原創系列。
如果你關注DAO這個賽道,推薦閱讀第二條, DAO 如何為全球住房危機提供一個具有成本效益的解決方案。
RR丨作者
信息來源自substack ,略有修改,作者bullishdefi
Uniswap V3是我們這個領域中最複雜的創新之一。該協議有超過50億的TVL,每天的交易量超過10億美元。
Uniswap V2允許流動性提供者在整個價格範圍內提供流動性,而V3允許LP設置他們想要提供流動性的價格範圍。畢竟,Uniswap V3本身就是關於集中流動性。 V2中用於在0到無窮大的價格上提供流動性的相同100美元現在可以用於在1000到2000,1000.02到1000.05,或0到無限之間提供流動性。
V3發佈時,我瀏覽了一下他們的白皮書,理解了其流動性和價格計算背後的邏輯。其數學並不復雜,儘管它本可以得到更好的解釋。從那以後,已經發布了大量的補充材料,現在任何人都可以更容易地理解V3的工作原理。
Uniswap V3的要點是,提供的流動性範圍越小,資本效率就越高,LP累計費用就越多。
幾週前,我想探討流動性是如何在不同的資金池中分配的,以及一些LP賺了多少錢。在V2中,LP累積的費用被加回到池中,所以你可以查看他們擁有的流動性份額,併計算出他們賺了多少費用。然而在V3中,流動性提供者會收到一個反映其頭寸的ERC-721代幣,而且費用不會被添加回池中,因此計算費用需要一個完全不同的邏輯。
為了了解協議中費用計算的基本原理,我進行了一段艱苦的探索,本文涵蓋了我所了解的一切。
了解Tick
Tick是整數值,用於表示所有可能的價格集合。 LP可以通過選擇他們想要提供流動性的下限和上限tick來創建自定義頭寸。價格的計算方法使用以下公式:
因此,當LP選擇在2000到2050之間提供流動性時,他們實際上是在選擇提供流動性的tick(而不是價格),但為了使流動性的提供更加容易,UI顯示的是價格而不是tick。
舉個例子,假設一個LP選擇在200000和200200的tick內為USDC/ETH池提供流動性。這些tick的相應價格計算如下:
我們可以看到,tick對應的價格是2022.36和2063.21,這個價格似乎也是流動性提供者所選擇的,但實際上,這一切都與tick有關。
另一個要理解的主題是tick間距。
雖然tick是整數,但它們只能基於tick間距進行初始化。例如,費用為0.05%的USDC/ETH池的tick間距為10,那麼可以將價格範圍設置為10的倍數,即199990,200000,200010,200020…
不同資金池的收費等級及tick間距如下:
另一件需要注意的事情是,協議內的最大和最小tick被設置為-887272和887272。如果你想知道這些tick對應的價格,那麼可以隨意進行計算,但可以肯定的是,這些值足夠高(和低)來反映任何代幣的價格。
理解了Tick背後的邏輯之後,我們現在可以繼續理解協議中的不同狀態,這有助於跟踪價格(或Tick)、流動性和費用。
了解狀態
V3通過全局狀態、Tick-indexed狀態和頭寸狀態來跟踪所有tick和頭寸的流動性、價格和費用。讓我們看看這些狀態中的每一個,以了解協議中的費用是如何計算的。
全局狀態
如下表所示,合約的全局狀態包含了7個不同的變量。
protocolFees.token0和protocolFees.token1跟踪當前的協議費用,即交易費用中應計入協議而不是流動性提供者的部分。如果一個資金池的交易費是0.3%,協議費是1/10,那麼0.27%將歸流動性提供者,0.03%歸協議。
feeGrowthGlobal0X128和feeGrowthGlobal1X12是表示在整個合約歷史中每單位虛擬流動性應計總費用的變量。
feeGrowthGlobal旨在跟踪從資金池創建開始以來整個tick範圍內累積的費用。 feeGrowthGlobal是一個遞增變量,因為它的值只會隨著每次swap而增加。我們通過調用feeGrowthGlobal0X128變量得到的值必須除以2^128,因為這是協議存儲值以便於計算的格式。
Tick狀態
Tick State為每個Tick記錄以下7個變量:
在計算特定tick內的費用時,使用變量feeGrowthOutside。變量feeGrowthOutside是一個函數,它取決於當前活動的tick(即當前價格)是否大於tick本身。
現在讓我們看看這些費用是如何計算的。
費用下限和費用上限取決於當前的tick是否大於(或小於)tick本身的函數。
讓我們試著通過一個例子來理解它,在這個例子中active tick位於下限和上限之間。在這種情況下,代表特定tick的累計費用是根據上述公式計算的,這意味著下圖所示的區域。
因此,一旦我們有了feeGrowthLower (fl)和feeGrowthUpper (fu),我們就可以通過從feeGrowthGlobal變量中減去這兩個值來計算任何tick範圍內的費用。
讓我們來看另一個例子,其活動範圍在tick範圍之外,並且超過了tick上限和下限。
在這種情況下,費用變量具有不同的值,因此該範圍內的費用計算將是:
需要注意的一點是,變量feeGrowthOutside根據active tick的位置而具有不同的值。
在第一個例子中,feeGrowthOutside表示tick的右側,而在第二個例子中,它表示tick的左側。這是因為feeGrowthOutside變量是活動tick的一個函數,它的值會根據活動tick的位置而改變。
更新feeGrowthOutside的方式會使不同tick之間的比較不一致。這是因為feeGrowthOutside可以在不同的時間被初始化。只有在創建以特定tick為邊界的頭寸時,才會初始化該tick的feeGrowthOutside。當feeGrowthOutside被初始化時,其值為…
使用上述公式,我們可以通過查詢Uniswap V3智能合約來計算任何tick範圍內的費用。
頭寸狀態
頭寸狀態存儲了與我們的流動性頭寸相關的信息。
這裡的流動性指的是我們提供給資金池的流動性。 feeGrowthInside是一個常數,表示在最後一次更新我們的流動性或所欠費用時,每單位流動性的總費用增長。
首先,feeGrowthRange使用Tick狀態的值計算,但使用的是與我們的頭寸相同的tick值。然後,我們從中減去feeGrowthInside,並將其乘以我們頭寸的流動性。
結語
希望這篇文章能讓你更容易理解V3中的費用計算。更多精彩內容請前往我們的網站Allrecord重構。