原標題《Paradigm研究合夥人:在Uniswapv3之上實現“經典”流動性挖礦》

本文來源:https://www.paradigm.xyz/2021/05/liquidity-mining-on-uniswap-v3/

作者:Dan Robinson

Uniswap v3用非同質化的ERC-721流動性頭寸代替了同質化的ERC-20流動性頭寸。

這是否意味著它不再支持靈活的UniswapV2風格的流動性挖礦?必須選擇特定的激勵範圍,積極管理流動性挖礦嗎?還是可以通過提供大量非活躍流動性來在流動性挖礦中進行博弈?

不。

Uniswap v3可以支持與Uniswap v2相同類型的流動性挖礦——以每秒固定的速率、按比例激勵所有活躍流動性,只需作出相對較小的折衷。它間接地激勵了流動性的集中,因為流動性提供者根據他們在虛擬流動性中的份額(當它活躍時)獲得獎勵,而不是根據所提供代幣的總價值。它甚至可以在一個單一的質押合約中做到這一切,使人們可以同時利用多種激勵來質押相同的流動性,而無需為不同的激勵措施部署新合約。

Omar Bohsali(現為Paradigm的駐場企業家)最近獲得了Uniswap資助項目的資助,以實現該算法。您可以在GitHub上查看跟踪他的進度。

這是關於我如何學會停止擔心並喜歡上非同質化流動性系列文章中的第一篇。下一篇文章將討論Uniswap v3頭寸將如何被用作抵押品。

1

價值十億美元的算法

要了解標準流動性挖礦算法如何適用於Uniswap v3,我們首先需要了解它在早期版本的Uniswap中是如何工作的。

第一個在鏈上計算獎勵的流動性挖礦項目是SNX對Uniswap sETH池的獎勵。這是Anton Bukov在2019年撰寫的Unipool sETH合約中實現的。我認為這是有史以來最具影響力的智能合約之一。

假設你想激勵Uniswap v1或v2池在特定時期內的流動性。想要在流動性提供者之間公平地分配代幣,並且是隨時間線性分配(例如,以每秒R個代幣的速度)。

請想像,以秒為單位將池子切成一片片。對於每個部分,給定的流動性提供者都應收到

個代幣,其中l(t)是單個流動性提供者在t時刻的流動性代幣餘額,L(t)是該池在t時刻已質押的流動性總量。他們從t0到t1時間內得到的獎勵將是這段時間內每秒獎勵的總和:

這在鏈下是很容易計算的。但是我們如何才能在鏈上有效地計算它,在每次有人進入或退出池子時進行增量更新?

如果餘額l 在那段時間內是恆定的,則可以將以上公式簡化為:

然後,我們可以將該和分解為兩個和的差。 (Uniswap v2中引入的oracle accumulator使用了非常類似的技巧。)

這意味著我們需要在質押合同中進行跟踪的是自池子開始時,就跟踪“每流動性秒數”這個指標的accumulator:

在Unipool合約中,這個accumulator 被稱為rewardPerTokenStored。當任何人質押或解押流動性(即改變L 時,質押合約會通過增加accumulator

到先前的值來更新Sl accumulator。 (從技術上講,在Unipool合同及其大部分的分叉中,accumulator跟踪R/L,而不是在後面乘以獎勵率。)

當某人質押流動性時,合約會檢查其累計值的初始值Sl(t0)。當他們以後解押時,合約將查看accumulator的新值Sl(t1)併計算該期間的獎勵:

Uniswap v1和v2不需要對這些激勵措施的有任何內置支持,因為這些數字(accumulator和checkpointed values)僅在涉及質押合約時才會更改。

除了為收益農耕趨勢奠定基礎(在此過程中它被反複分叉),這種聰明的算法還具有相當多的用途。例如,Uniswap v3使用類似的算法來跟踪單個頭寸賺取的費用(還有一些其他技巧來支持集中流動性)。它在鏈上是最有用的(效率很高),同時對簡化鏈下計算也很有用。 UNI追溯分配是基於一個查詢,該查詢在SQL中重新實現了該算法。

2

轉入正題

Uniswap v3使情況復雜化,但並非無法解決。

如白皮書中所述,Uniswap v3支持集中流動性——流動性僅在當前的價格變動(ic)處於特定範圍

內時才有效。

這意味著價格變動可以改變已抵押頭寸的流動性餘額,而不會涉及到抵押合同。對於具有l 流動性的給定頭寸,我們現在需要計算:

這可以分解為:

我們可以將其解釋為secondsPerLiquidityInside = secondsPerLiquidity– secondsPerLiquidityBelow(lowerTick) - secondsPerLiquidityAbove(upperTick)。

可以使用上述相同的全局Sl accumulator來計算第一項。在Uniswap v3合約中,該全局accumulator與價格預言機一起被跟踪,如secondsPerLiquidityX128。

為了讓我們能夠計算其他兩個項,每經歷一個時刻,Uniswap v3檢查點secondsPerLiquidityOutside()就會對該時點進行計算。 “外部”是指與當前價格相對的價格變動。這讓我們可以隨時計算secondsPerLiquidity任何一方的應計總額。例如,如果tickCurrent < i,則secondsPerLiquidityBelow(i) = secondsPerLiquidity - secondsPerLiquidityOutside(i); 如果tickCurrent >= i,則secondsPerLiquidityBelow(i) = secondsPerLiquidityOutside(i)。 (這與Uniswap v3跟踪和計算某時刻前後賺取的費用非常相似。)

因此,對於任意範圍,我們都可以使用上面的公式來計算secondsPerLiquidityInside該範圍。 Uniswap v3會為你執行此計算,並通過便捷snapshotCumulativesInside 函數公開結果。

當用戶解押時,解押合約可以簡單地對此secondsPerLiquidityInside進行快照。當他們以後解押時,解押合約會查看新合約secondsPerLiquidityInside,取其差額,並將其乘以R·l ,以獲得該時期內該頭寸賺取的總獎勵。

3

妥協

我們確實需要根據新系統的技術局限性作出一些妥協:

模糊的截止時間:無法在激勵結束的確切時刻自動快照所有accumulators。截止後,合約不能完全區分截止前存入的流動性和之後存入的流動性。為了適應這一點,合約可以對激勵結束後解押的人的獎勵率進行衰減處理。想要鎖定確切獎勵率的人需要在此之前解押。 ·非質押(Unstaked)的流動性:該算法使用核心合約中的活躍流動性總量,這可能高於總質押的流動性。非質押的流動性仍將被分配一部分獎勵,就像它已被質押但未被領取一樣。激勵措施的創建者可以指定一個認領期限,在此期限之後他們可以收回所有無人認領的獎勵。

結論

Uniswap v3並沒“破壞”流動性挖礦,而是為其開闢了廣闊的設計空間。儘管這篇文章描述了一種在Uniswap v3之上實現“經典”流動性挖礦的算法,但我認為談得還是太淺了。如白皮書第6.3節所述,Uniswap v3核心合約公開了其他幾個索引(例如secondsOutside和tickCumulativeOutside)。我期待看到協議是如何利用這些新功能的。

在以後的文章中,我將解決關於Uniswap v3頭寸的另一個普遍關注的問題:貸款協議如何將其用作抵押品。