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
                });
            }
        }
    }
}
/// @title Tick Lens contract
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
            });
        }
    }
}

/// @inheritdoc ITickLens