43 lines
1.5 KiB
Solidity
43 lines
1.5 KiB
Solidity
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
pragma solidity >=0.5.0;
|
||
|
pragma abicoder v2;
|
||
|
|
||
|
import '@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol';
|
||
|
|
||
|
import '../interfaces/ITickLens.sol';
|
||
|
|
||
|
/// @title Tick Lens contract
|
||
|
contract TickLens is ITickLens {
|
||
|
/// @inheritdoc ITickLens
|
||
|
function getPopulatedTicksInWord(address pool, int16 tickBitmapIndex)
|
||
|
public
|
||
|
view
|
||
|
override
|
||
|
returns (PopulatedTick[] memory populatedTicks)
|
||
|
{
|
||
|
// fetch bitmap
|
||
|
uint256 bitmap = IUniswapV3Pool(pool).tickBitmap(tickBitmapIndex);
|
||
|
|
||
|
// calculate the number of populated ticks
|
||
|
uint256 numberOfPopulatedTicks;
|
||
|
for (uint256 i = 0; i < 256; i++) {
|
||
|
if (bitmap & (1 << i) > 0) numberOfPopulatedTicks++;
|
||
|
}
|
||
|
|
||
|
// fetch populated tick data
|
||
|
int24 tickSpacing = IUniswapV3Pool(pool).tickSpacing();
|
||
|
populatedTicks = new PopulatedTick[](numberOfPopulatedTicks);
|
||
|
for (uint256 i = 0; i < 256; i++) {
|
||
|
if (bitmap & (1 << i) > 0) {
|
||
|
int24 populatedTick = ((int24(tickBitmapIndex) << 8) + int24(i)) * tickSpacing;
|
||
|
(uint128 liquidityGross, int128 liquidityNet, , , , , , ) = IUniswapV3Pool(pool).ticks(populatedTick);
|
||
|
populatedTicks[--numberOfPopulatedTicks] = PopulatedTick({
|
||
|
tick: populatedTick,
|
||
|
liquidityNet: liquidityNet,
|
||
|
liquidityGross: liquidityGross
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|