Solidity

在 Uniswap v3 中添加流動資金池時計算存款金額

  • October 18, 2021

認為:

  • A/B 代幣對的價格為price_now
  • 使用者希望在以下範圍內提供price_low流動price_highprice_low < price_now < price_high
  • 使用者提供X代幣 A 的數量

創建新的 Uniswap v3 位置

需要存入多少代幣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 顯示的非常接近。

引用自:https://ethereum.stackexchange.com/questions/99425