PancakeSwapV3 里面,对于一个PancakePool里面的sqrtPriceX96如何计算得到 newSqrtPriceX96,这个公式是怎么样的?

直接上代码

func GetAmountOutV3(amountIn, sqrtPriceX96, fee *big.Int, zeroForOne bool) (*big.Int, *big.Int) {
	var amountOutInt *big.Int
	var amountOutFloat *big.Float
	var accuracy big.Accuracy
	var newSqrtPriceX96 *big.Int

	feeInHundredthsOfBip, _ := fee.Float64() // 2500 bips in hundredths of a bip

	Q96 := new(big.Int).Exp(big.NewInt(2), big.NewInt(96), nil)
	sqrtPrice := new(big.Float).Quo(new(big.Float).SetInt(sqrtPriceX96), new(big.Float).SetInt(Q96))
	price := new(big.Float).Mul(sqrtPrice, sqrtPrice)

	fmt.Println("price:", price)

	// Convert feeInHundredthsOfBip to a multiplier
	feeMultiplier := new(big.Float).SetFloat64(1 - (feeInHundredthsOfBip / 1000000.0))

	amountInFloat := new(big.Float).SetInt(amountIn)
	amountInFloat.Mul(amountInFloat, feeMultiplier)

	// 看路径是正还是反
	if zeroForOne {
		amountOutFloat = new(big.Float).Mul(amountInFloat, price)

	} else {
		amountOutFloat = new(big.Float).Quo(amountInFloat, price)

	}

	amountOutInt, accuracy = amountOutFloat.Int(nil)
	if accuracy != big.Exact {
		fmt.Println("Accuracy error:", accuracy)
	}

	fmt.Println("Amount of you can get: ", amountOutInt)

	fmt.Println("newSqrtPriceX96:", newSqrtPriceX96)

	return amountOutInt, newSqrtPriceX96
}

现在得到的 amountOutInt 是符合预期的,但是这个newSqrtPriceX96不知道怎么计算了。求助!

请先 登录 后评论

1 个回答

赵逸 - 区块链开发

image.png
换个说法。这个sqrtPriceX96 可以根据这个公式得到price,然后因为购买后流动池发生变化,这个price也会发生变化,如何知道新的price

请先 登录 后评论
  • 1 关注
  • 0 收藏,1393 浏览
  • 赵逸 提出于 2024-06-26 00:17