This commit is contained in:
JulesCrown 2023-11-25 19:47:37 +01:00
parent df93bffc9f
commit bd97659492

View file

@ -49,11 +49,17 @@ contract LiquidityManager {
// the fee growth of the aggregate position as of the last action on the individual position // the fee growth of the aggregate position as of the last action on the individual position
uint256 feeGrowthInside0LastX128; uint256 feeGrowthInside0LastX128;
uint256 feeGrowthInside1LastX128; uint256 feeGrowthInside1LastX128;
// how many uncollected tokens are owed to the position, as of the last computation
uint128 tokensOwed0;
uint128 tokensOwed1;
} }
struct FeesOwed {
// how many uncollected tokens are owed
// updated by each position, as of the last computation
uint128 tokensOwed;
uint128 ethOwed;
}
mapping(address => FeesOwed) private _feesOwed;
/// @dev The token ID position data /// @dev The token ID position data
mapping(bytes32 => TokenPosition) private _positions; mapping(bytes32 => TokenPosition) private _positions;
@ -67,6 +73,16 @@ contract LiquidityManager {
return (token0isWeth) ? token1 : token0; return (token0isWeth) ? token1 : token0;
} }
function getFeesOwed(address token) public view returns (uint128 tokensOwed, uint128 ethOwed) {
(tokensOwed, ethOwed) = _feesOwed[token];
}
function updateFeesOwed(bool token0isEth, address token, uint128 tokensOwed0, uint128 tokensOwed1) internal {
FeesOwed storage feesOwed = _feesOwed[token];
feesOwed = (feesOwed.tokensOwed += token0isEth ? tokensOwed1 : tokensOwed0,
feesOwed.ethOwed += token0isEth ? tokensOwed0 : tokensOwed1);
}
function posKey(address _token, uint24 _tickLower, uint24, tickUpper) internal pure returns (uint256) { function posKey(address _token, uint24 _tickLower, uint24, tickUpper) internal pure returns (uint256) {
return uint160(_token) << 48 + tickLower << 24 + tickUpper; return uint160(_token) << 48 + tickLower << 24 + tickUpper;
} }
@ -75,18 +91,14 @@ contract LiquidityManager {
returns ( returns (
uint128 liquidity, uint128 liquidity,
uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside0LastX128,
uint256 feeGrowthInside1LastX128, uint256 feeGrowthInside1LastX128
uint128 tokensOwed0,
uint128 tokensOwed1
) )
{ {
TokenPosition memory position = _positions[posKey(_token, tickLower, tickUpper)]; TokenPosition memory position = _positions[posKey(_token, tickLower, tickUpper)];
return ( return (
position.liquidity, position.liquidity,
position.feeGrowthInside0LastX128, position.feeGrowthInside0LastX128,
position.feeGrowthInside1LastX128, position.feeGrowthInside1LastX128
position.tokensOwed0,
position.tokensOwed1
); );
} }
@ -148,32 +160,30 @@ contract LiquidityManager {
(, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, , ) = pool.positions(positionKey); (, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, , ) = pool.positions(positionKey);
TokenPosition memory position = _positions[posKey(getToken(params.token0, params.token1), tickLower, tickUpper)]; (bool token0isWeth, address token) = getToken(params.token0, params.token1);
TokenPosition memory position = _positions[posKey(token, tickLower, tickUpper)];
if (liquidity == 0) { if (liquidity == 0) {
// create entry // create entry
position = TokenPosition({ position = TokenPosition({
liquidity: liquidity, liquidity: liquidity,
feeGrowthInside0LastX128: feeGrowthInside0LastX128, feeGrowthInside0LastX128: feeGrowthInside0LastX128,
feeGrowthInside1LastX128: feeGrowthInside1LastX128, feeGrowthInside1LastX128: feeGrowthInside1LastX128
tokensOwed0: 0,
tokensOwed1: 0
}); });
} else { } else {
// update entry // update entry
position.tokensOwed0 += uint128( updateTokensOwed(token0isWeth, token, uint128(
FullMath.mulDiv( FullMath.mulDiv(
feeGrowthInside0LastX128 - position.feeGrowthInside0LastX128, feeGrowthInside0LastX128 - position.feeGrowthInside0LastX128,
position.liquidity, position.liquidity,
FixedPoint128.Q128 FixedPoint128.Q128
) )
); ), uint128(
position.tokensOwed1 += uint128(
FullMath.mulDiv( FullMath.mulDiv(
feeGrowthInside1LastX128 - position.feeGrowthInside1LastX128, feeGrowthInside1LastX128 - position.feeGrowthInside1LastX128,
position.liquidity, position.liquidity,
FixedPoint128.Q128 FixedPoint128.Q128
) )
); ));
position.feeGrowthInside0LastX128 = feeGrowthInside0LastX128; position.feeGrowthInside0LastX128 = feeGrowthInside0LastX128;
position.feeGrowthInside1LastX128 = feeGrowthInside1LastX128; position.feeGrowthInside1LastX128 = feeGrowthInside1LastX128;
@ -193,7 +203,8 @@ contract LiquidityManager {
{ {
require(params.liquidity > 0); require(params.liquidity > 0);
TokenPosition memory position = _positions[posKey(getToken(params.token0, params.token1), tickLower, tickUpper)]; (bool token0isWeth, address token) = getToken(params.token0, params.token1);
TokenPosition memory position = _positions[posKey(token, tickLower, tickUpper)];
uint128 positionLiquidity = position.liquidity; uint128 positionLiquidity = position.liquidity;
require(positionLiquidity >= params.liquidity); require(positionLiquidity >= params.liquidity);
@ -209,24 +220,21 @@ contract LiquidityManager {
// this is now updated to the current transaction // this is now updated to the current transaction
(, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, , ) = pool.positions(positionKey); (, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, , ) = pool.positions(positionKey);
position.tokensOwed0 += updateTokensOwed(token0isWeth, token, uint128(amount0) +
uint128(amount0) +
uint128( uint128(
FullMath.mulDiv( FullMath.mulDiv(
feeGrowthInside0LastX128 - position.feeGrowthInside0LastX128, feeGrowthInside0LastX128 - position.feeGrowthInside0LastX128,
positionLiquidity, positionLiquidity,
FixedPoint128.Q128 FixedPoint128.Q128
) )
); ), uint128(amount1) +
position.tokensOwed1 +=
uint128(amount1) +
uint128( uint128(
FullMath.mulDiv( FullMath.mulDiv(
feeGrowthInside1LastX128 - position.feeGrowthInside1LastX128, feeGrowthInside1LastX128 - position.feeGrowthInside1LastX128,
positionLiquidity, positionLiquidity,
FixedPoint128.Q128 FixedPoint128.Q128
) )
); ));
position.feeGrowthInside0LastX128 = feeGrowthInside0LastX128; position.feeGrowthInside0LastX128 = feeGrowthInside0LastX128;
position.feeGrowthInside1LastX128 = feeGrowthInside1LastX128; position.feeGrowthInside1LastX128 = feeGrowthInside1LastX128;