Vulnerability: An attacker can increase liquidity to the position's UniswapNFT to prevent the position from being closed
Severity: high

Description:
UniswapV3NPM allows the user to increase liquidity to any NFT.\\n```\\n            function increaseLiquidity(IncreaseLiquidityParams calldata params)\\n                 external payable override checkDeadline(params.deadline)\\n                    returns (\\n                     uint128 liquidity, uint256 amount0, uint256 amount1)\\n            {\\n            Position storage position = _positions[params.tokenId];\\n                PoolAddress.PoolKey memory poolKey = _poolIdToPoolKey[position.poolId];\\n                    IUniswapV3Pool pool;\\n                        (liquidity, amount0, amount1, pool) = addLiquidity(\\n```\\n\\nWhen closing a position, in `_redeemPosition()`, only the initial liquidity of the NFT will be decreased, and then the NFT will be burned.\\n```\\n             function _redeemPosition(\\n                    address _user, uint _posId\\n                     ) internal override returns (address[] memory rewardTokens, uint[] memory rewardAmts) {\\n                        address _positionManager = positionManager;\\n                    uint128 collAmt = IUniswapV3PositionManager(_positionManager).getPositionCollAmt(_user, \\n                    _posId);\\n                    // 1. take lp & extra coll tokens from lending proxy\\n                    _takeAllCollTokens(_positionManager, _user, _posId, address(this));\\n                         UniV3ExtraPosInfo memory extraPosInfo = IUniswapV3PositionManager(_positionManager)\\n                             .getDecodedExtraPosInfo(_user, _posId);\\n                        address _uniswapV3NPM = uniswapV3NPM; // gas saving\\n                    // 2. remove underlying tokens from lp (internal remove in NPM)\\n                    IUniswapV3NPM(_uniswapV3NPM).decreaseLiquidity(\\n                        IUniswapV3NPM.DecreaseLiquidityParams({\\n                            tokenId: extraPosInfo.uniV3PositionId,liquidity: collAmt, amount0Min: 0,\\n                    amount1Min: 0,\\n                         deadline: block.timestamp\\n                    })\\n                    );\\n                    // rest of code\\n                    // 4. burn LP position\\n                          IUniswapV3NPM(_uniswapV3NPM).burn(extraPosInfo.uniV3PositionId);\\n                      }\\n```\\n\\nIf the liquidity of the NFT is not 0, burning will fail.\\n```\\n        function burn(uint256 tokenId) external payable override isAuthorizedForToken(tokenId) {\\n            Position storage position = _positions[tokenId];\\n                require(position.liquidity == 0 && position.tokensOwed0 == 0 && position.tokensOwed1 == 0,'Not cleared');\\n             delete _positions[tokenId];\\n        _burn(tokenId);\\n        }\\n```\\n\\nThis allows an attacker to add 1 wei liquidity to the position's NFT to prevent the position from being closed, and later when the position expires, the attacker can liquidate it.

Impact:

Recommended mitigation:
Consider decreasing the actual liquidity(using uniswapV3NPM.positions to get it) of the NFT in `_redeemPosition()`, instead of the initial liquidity