Skip to content

Commit

Permalink
Add getLiquidityByAddress & getAccumulatedFee
Browse files Browse the repository at this point in the history
  • Loading branch information
NFTknight committed Oct 14, 2024
1 parent 75ea0b9 commit d6d6678
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 0 deletions.
56 changes: 56 additions & 0 deletions src/UniswapV3Pool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,9 @@ contract UniswapV3Pool is IUniswapV3Pool {
mapping(int24 => Tick.Info) public ticks;
mapping(int16 => uint256) public tickBitmap;
mapping(bytes32 => Position.Info) public positions;
mapping(address => IUniswapV3Pool.LiquidityState[]) public liquiditiesList;
address[] public liquidityProviders;

Oracle.Observation[65535] public observations;

constructor() {
Expand Down Expand Up @@ -246,6 +249,31 @@ contract UniswapV3Pool is IUniswapV3Pool {
liquidity,
params.liquidityDelta
);

uint256 i;
if (liquiditiesList[params.owner].length == 0)
liquidityProviders.push(params.owner);
IUniswapV3Pool.LiquidityState[]
storage liquidities = liquiditiesList[params.owner];
for (i = 0; i < liquidities.length; i++)
if (
liquidities[i].lowerTick == params.lowerTick &&
liquidities[i].upperTick == params.upperTick
) {
liquidities[i].liquidity = LiquidityMath.addLiquidity(
liquidities[i].liquidity,
params.liquidityDelta
);
break;
}
if (i == liquidities.length)
liquidities.push(
IUniswapV3Pool.LiquidityState({
lowerTick: params.lowerTick,
upperTick: params.upperTick,
liquidity: uint128(params.liquidityDelta)
})
);
} else {
amount1 = Math.calcAmount1Delta(
TickMath.getSqrtRatioAtTick(params.lowerTick),
Expand All @@ -255,6 +283,12 @@ contract UniswapV3Pool is IUniswapV3Pool {
}
}

function getLiquidityByAddress(
address owner
) external view returns (IUniswapV3Pool.LiquidityState[] memory) {
return liquiditiesList[owner];
}

function mint(
address owner,
int24 lowerTick,
Expand Down Expand Up @@ -631,6 +665,28 @@ contract UniswapV3Pool is IUniswapV3Pool {
}
}

function getAccumulatedFee(
address owner,
int24 lowerTick,
int24 upperTick
) external view returns (uint256 amount0, uint256 amount1) {
Position.Info storage position = positions.get(
owner,
lowerTick,
upperTick
);
(uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = ticks
.getFeeGrowthInside(
lowerTick,
upperTick,
slot0.tick,
feeGrowthGlobal0X128,
feeGrowthGlobal1X128
);

(amount0, amount1) = position.calcAccumalatedAmount(feeGrowthInside0X128, feeGrowthInside1X128);
}

////////////////////////////////////////////////////////////////////////////
//
// INTERNAL
Expand Down
15 changes: 15 additions & 0 deletions src/interfaces/IUniswapV3Pool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@ interface IUniswapV3Pool {
address payer;
}

struct LiquidityState {
int24 lowerTick;
int24 upperTick;
uint128 liquidity;
}

function getAccumulatedFee(
address owner,
int24 lowerTick,
int24 upperTick
) external view returns (uint256 amount0, uint256 amount1);

function slot0()
external
view
Expand Down Expand Up @@ -69,4 +81,7 @@ interface IUniswapV3Pool {
uint160 sqrtPriceLimitX96,
bytes calldata data
) external returns (int256, int256);

function getLiquidityByAddress(address owner) external view returns (LiquidityState[] memory);

}

0 comments on commit d6d6678

Please sign in to comment.