Solidity
在 Uniswap v3 中添加流動資金池時計算存款金額
認為:
- A/B 代幣對的價格為
price_now
- 使用者希望在以下範圍內提供
price_low
流動price_high
性price_low < price_now < price_high
- 使用者提供
X
代幣 A 的數量需要存入多少代幣B?例如,如果我想在螢幕截圖中提供 1 個 ETH,則需要 2907.47 USDC。我需要一個數學公式。
要回答這個問題,首先您需要計算給定目前價格和價格範圍
Liquidity_x
的資產提供的流動性。x
從白皮書中可以得出,如果目前價格在該範圍內,則:Liquidity_x = x * sqrt(price) * sqrt(price_high) / (sqrt(price_high) - sqrt(price))
有關更多詳細資訊,請參閱本文。
Liquidity_y
或者,如果您有y
已知數量,這是公式:Liquidity_y = y / (sqrt(price) - sqrt(price_low))
然後,您應該使用目標是獲得最佳平衡位置這一事實,其中
Liquidity_y
==Liquidity_x
。(解釋:為了計算目前價格在價格範圍內的頭寸的流動性,Uniswap 使用該頭寸中兩個代幣提供的流動性中的最小值。如果一個代幣的數量超過必要,則額外的流動性從 LP 的角度來看,provided 基本上被忽略了。因此,您的目標是y
在池中擁有如此數量的 ,以使 的流動性與 : 的流動性完全匹配y
。)x``Liquidity_x``Liquidity_y
求解上面的第二個方程為
y
您得到:y = Liquidity_y * (sqrt(price) - sqrt(price_low))
在範例中:
x = 1 price = 2486.8 price_high = 2998.9 price_low = 1994.2 L = x * sqrt(price) * sqrt(price_high) / (sqrt(price_high) - sqrt(price)) # L = 557.9599554712883 in the example y = L * (sqrt(price) - sqrt(price_low))
結果
y
值為 2907.729524805772 USDC,與 UI 顯示的非常接近。