Skip to content

Commit

Permalink
refactor: liquidity_amounts
Browse files Browse the repository at this point in the history
  • Loading branch information
notJoon committed Feb 14, 2024
1 parent 24da3df commit 3722e7a
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 67 deletions.
2 changes: 1 addition & 1 deletion position/_GET_position.gno
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,5 @@ func PositionGetPositionTokensOwed1(tokenId uint64) bigint {
}

func PositionGetAmountsForLiquidity(sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, liquidity bigint) (bigint, bigint) {
return liquidityAmountsGetAmountsForLiquidity(sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, liquidity)
return GetAmountsForLiquidity(sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, liquidity)
}
2 changes: 1 addition & 1 deletion position/_RPC_api.gno
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ func rpcMakePosition(lpTokenId uint64) RpcPosition {
lowerX96 := p.TickMathGetSqrtRatioAtTick(position.tickLower)
upperX96 := p.TickMathGetSqrtRatioAtTick(position.tickUpper)

token0Balance, token1Balance := liquidityAmountsGetAmountsForLiquidity(
token0Balance, token1Balance := GetAmountsForLiquidity(
currentX96,
lowerX96,
upperX96,
Expand Down
2 changes: 1 addition & 1 deletion position/_RPC_dry.gno
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func DryMint(
sqrtLowerX96 := p.TickMathGetSqrtRatioAtTick(tickLower)
sqrtUpperX96 := p.TickMathGetSqrtRatioAtTick(tickUpper)

liquidity := liquidityAmountsGetLiquidityForAmounts(
liquidity := GetLiquidityForAmounts(
sqrtRatioX96,
sqrtLowerX96,
sqrtUpperX96,
Expand Down
118 changes: 55 additions & 63 deletions position/liquidity_amounts.gno
Original file line number Diff line number Diff line change
@@ -1,49 +1,53 @@
package position

func liquidityAmountsGetLiquidityForAmount0(
sqrtRatioAX96 bigint,
sqrtRatioBX96 bigint,
amount0 bigint,
) bigint {
if sqrtRatioAX96 > sqrtRatioBX96 {
sqrtRatioAX96, sqrtRatioBX96 = sqrtRatioBX96, sqrtRatioAX96
import (
"gno.land/r/demo/consts"
)

// swapIfGreater checkes if the first value is greater than
// the second then swaps two values.
func swapIfGreater(a, b bigint) (bigint, bigint) {
if a > b {
return b, a
}

intermediate := (sqrtRatioAX96 * sqrtRatioBX96) / Q96
return a, b
}

return amount0 * intermediate / (sqrtRatioBX96 - sqrtRatioAX96)
// calcIntermediateValue computes the intermediate value
// used in liquidity calculations.
func calcIntermediateValue(sqrtRatioA, sqrtRatioB bigint) bigint {
return (sqrtRatioA * sqrtRatioB) / consts.Q96
}

func liquidityAmountsGetLiquidityForAmount1(
sqrtRatioAX96 bigint,
sqrtRatioBX96 bigint,
amount1 bigint,
) bigint {
if sqrtRatioAX96 > sqrtRatioBX96 {
sqrtRatioAX96, sqrtRatioBX96 = sqrtRatioBX96, sqrtRatioAX96
}
// GetLiquidityForAmount0 calculates liquidity for a given amount of token 0.
func computeLiquidityForAmount0(sqrtRatioA, sqrtRatioB, amount0 bigint) bigint {
sqrtRatioA, sqrtRatioB = swapIfGreater(sqrtRatioA, sqrtRatioB)
intermediate := calcIntermediateValue(sqrtRatioA, sqrtRatioB)
diff := sqrtRatioB - sqrtRatioA

return amount1 * Q96 / (sqrtRatioBX96 - sqrtRatioAX96)
// we don't need to care about division by zero here.
return amount0 * intermediate / diff
}

func liquidityAmountsGetLiquidityForAmounts(
sqrtRatioX96 bigint,
sqrtRatioAX96 bigint,
sqrtRatioBX96 bigint,
amount0 bigint,
amount1 bigint,
) bigint {
var liquidity bigint
// computeLiquidityForAmount1 calculates liquidity for a given amount of token 1.
func computeLiquidityForAmount1(sqrtRatioA, sqrtRatioB, amount1 bigint) bigint {
sqrtRatioA, sqrtRatioB = swapIfGreater(sqrtRatioA, sqrtRatioB)
diff := sqrtRatioB - sqrtRatioA

if sqrtRatioAX96 > sqrtRatioBX96 {
sqrtRatioAX96, sqrtRatioBX96 = sqrtRatioBX96, sqrtRatioAX96
}
return (amount1 * consts.Q96) / diff
}

if sqrtRatioX96 <= sqrtRatioAX96 {
liquidity = liquidityAmountsGetLiquidityForAmount0(sqrtRatioAX96, sqrtRatioBX96, amount0)
} else if sqrtRatioX96 < sqrtRatioBX96 {
liquidity0 := liquidityAmountsGetLiquidityForAmount0(sqrtRatioX96, sqrtRatioBX96, amount0)
liquidity1 := liquidityAmountsGetLiquidityForAmount1(sqrtRatioAX96, sqrtRatioX96, amount1)
// GetLiquidityForAmounts calculates the liquidity for given amounts od token 0 and token 1.
func GetLiquidityForAmounts(sqrtRatioX, sqrtRatioA, sqrtRatioB, amount0, amount1 bigint) bigint {
sqrtRatioA, sqrtRatioB = swapIfGreater(sqrtRatioA, sqrtRatioB)
var liquidity bigint

if sqrtRatioX <= sqrtRatioA {
liquidity = computeLiquidityForAmount0(sqrtRatioA, sqrtRatioB, amount0)
} else if sqrtRatioX < sqrtRatioB {
liquidity0 := computeLiquidityForAmount0(sqrtRatioX, sqrtRatioB, amount0)
liquidity1 := computeLiquidityForAmount1(sqrtRatioA, sqrtRatioX, amount1)

if liquidity0 < liquidity1 {
liquidity = liquidity0
Expand All @@ -52,55 +56,43 @@ func liquidityAmountsGetLiquidityForAmounts(
}

} else {
liquidity = liquidityAmountsGetLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, amount1)
liquidity = computeLiquidityForAmount1(sqrtRatioA, sqrtRatioB, amount1)
}

return liquidity
}

func liquidityAmountsGetAmount0ForLiquidity(
sqrtRatioAX96 bigint,
sqrtRatioBX96 bigint,
liquidity bigint,
) bigint {
if sqrtRatioAX96 > sqrtRatioBX96 {
sqrtRatioAX96, sqrtRatioBX96 = sqrtRatioBX96, sqrtRatioAX96
}
// computeAmount0ForLiquidity calculates the amount of token 0 for a given liquidity.
func computeAmount0ForLiquidity(sqrtRatioA, sqrtRatioB, liquidity bigint) bigint {
sqrtRatioA, sqrtRatioB = swapIfGreater(sqrtRatioA, sqrtRatioB)
diff := sqrtRatioB - sqrtRatioA

return ((liquidity << 96) * (sqrtRatioBX96 - sqrtRatioAX96) / sqrtRatioBX96) / sqrtRatioAX96
return (liquidity << 96) * diff / (sqrtRatioB * sqrtRatioA)
}

func liquidityAmountsGetAmount1ForLiquidity(
sqrtRatioAX96 bigint,
sqrtRatioBX96 bigint,
liquidity bigint,
) bigint {
if sqrtRatioAX96 > sqrtRatioBX96 {
sqrtRatioAX96, sqrtRatioBX96 = sqrtRatioBX96, sqrtRatioAX96
}
// computeAmount1ForLiquidity calculates the amount of token 1 for a given liquidity.
func computeAmount1ForLiquidity(sqrtRatioA, sqrtRatioB, liquidity bigint) bigint {
sqrtRatioA, sqrtRatioB = swapIfGreater(sqrtRatioA, sqrtRatioB)
diff := sqrtRatioB - sqrtRatioA

return liquidity * (sqrtRatioBX96 - sqrtRatioAX96) / Q96
return liquidity * diff / consts.Q96
}

func liquidityAmountsGetAmountsForLiquidity(
sqrtRatioX96 bigint,
sqrtRatioAX96 bigint,
sqrtRatioBX96 bigint,
liquidity bigint,
) (bigint, bigint) {
// GetAmountsForLiquidity calculates the amounts of token 0 and token 1 for a given liquidity.
func GetAmountsForLiquidity(sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, liquidity bigint) (bigint, bigint) {
var amount0, amount1 bigint

if sqrtRatioAX96 > sqrtRatioBX96 {
sqrtRatioAX96, sqrtRatioBX96 = sqrtRatioBX96, sqrtRatioAX96
}

if sqrtRatioX96 <= sqrtRatioAX96 {
amount0 = liquidityAmountsGetAmount0ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity)
amount0 = computeAmount0ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity)
} else if sqrtRatioX96 < sqrtRatioBX96 {
amount0 = liquidityAmountsGetAmount0ForLiquidity(sqrtRatioX96, sqrtRatioBX96, liquidity)
amount1 = liquidityAmountsGetAmount1ForLiquidity(sqrtRatioAX96, sqrtRatioX96, liquidity)
amount0 = computeAmount0ForLiquidity(sqrtRatioX96, sqrtRatioBX96, liquidity)
amount1 = computeAmount1ForLiquidity(sqrtRatioAX96, sqrtRatioX96, liquidity)
} else {
amount1 = liquidityAmountsGetAmount1ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity)
amount1 = computeAmount1ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity)
}

return amount0, amount1
Expand Down
2 changes: 1 addition & 1 deletion position/liquidity_management.gno
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ func addLiquidity(params AddLiquidityParams) (bigint, bigint, bigint) {
sqrtRatioAX96 := p.TickMathGetSqrtRatioAtTick(params.tickLower)
sqrtRatioBX96 := p.TickMathGetSqrtRatioAtTick(params.tickUpper)

liquidity := liquidityAmountsGetLiquidityForAmounts(
liquidity := GetLiquidityForAmounts(
sqrtPriceX96,
sqrtRatioAX96,
sqrtRatioBX96,
Expand Down

0 comments on commit 3722e7a

Please sign in to comment.