Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: position/liquidity_amounts #160

Merged
merged 3 commits into from
Feb 16, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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"
)

// toAscendingOrder checkes if the first value is greater than
// the second then swaps two values.
func toAscendingOrder(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 = toAscendingOrder(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 = toAscendingOrder(sqrtRatioA, sqrtRatioB)
notJoon marked this conversation as resolved.
Show resolved Hide resolved
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 = toAscendingOrder(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 = toAscendingOrder(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 = toAscendingOrder(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