All collateral in Velodrome vault will be permantly locked if either asset in liquidity pair stays outside of min/max price
The oracles used have a built in safeguard to revert the transaction if the queried asset is outside of a defined price range. The issue with this is that every vault interaction requires the underlying collateral to be valued. If one of the assets in the pair goes outside it's immutable range then the entire vault will be frozen and all collateral will be permanently stuck.\\n```\\nfunction getOraclePrice(IAggregatorV3 _priceFeed, int192 _maxPrice, int192 _minPrice) public view returns (uint256 ) {\\n    (\\n        /*uint80 roundID*/,\\n        int signedPrice,\\n        /*uint startedAt*/,\\n        uint timeStamp,\\n        /*uint80 answeredInRound*/\\n    ) = _priceFeed.latestRoundData();\\n    //check for Chainlink oracle deviancies, force a revert if any are present. Helps prevent a LUNA like issue\\n    require(signedPrice > 0, "Negative Oracle Price");\\n    require(timeStamp >= block.timestamp - HEARTBEAT_TIME , "Stale pricefeed");\\n\\n    //@audit revert if price is outside of immutable bounds\\n    require(signedPrice < _maxPrice, "Upper price bound breached");\\n    require(signedPrice > _minPrice, "Lower price bound breached");\\n    uint256 price = uint256(signedPrice);\\n    return price;\\n}\\n```\\n\\nThe lines above are called each time and asset is priced. If the oracle returns outside of the predefined range then the transaction will revert.\\n```\\n    uint256 outstandingisoUSD = isoUSDdebt - _USDToVault;\\n    //@audit contract prices withdraw collateral\\n    uint256 colInUSD = _calculateProposedReturnedCapital(_collateralAddress, _loanNFTs, _partialPercentage);\\n    if(outstandingisoUSD >= TENTH_OF_CENT){ //ignore debts less than $0.001\\n        uint256 collateralLeft = totalCollateralValue(_collateralAddress, msg.sender) - colInUSD;\\n        uint256 borrowMargin = (outstandingisoUSD * minOpeningMargin) / LOAN_SCALE;\\n        require(collateralLeft > borrowMargin , "Remaining debt fails to meet minimum margin!");\\n    }\\n```\\n\\nWhen closing a loan the vault attempts to price the users collateral. Since this is the only way for a user to remove collateral is to call closeLoan, if the price of either asset in the LP goes outside of its bounds then all user deposits will be lost.
If a user is closing their entire loan then there is no need to check the value of the withdraw collateral because there is no longer any debt to collateralize. Move the check inside the inequality to allow the closeLoan to always function:\\n```\\n    uint256 outstandingisoUSD = isoUSDdebt - _USDToVault;\\n-   uint256 colInUSD = _calculateProposedReturnedCapital(_collateralAddress, _loanNFTs, _partialPercentage);\\n+   uint256 colInUSD;\\n    if(outstandingisoUSD >= TENTH_OF_CENT){ //ignore debts less than $0.001\\n+       uint256 colInUSD = _calculateProposedReturnedCapital(_collateralAddress, _loanNFTs, _partialPercentage);\\n        uint256 collateralLeft = totalCollateralValue(_collateralAddress, msg.sender) - colInUSD;\\n        uint256 borrowMargin = (outstandingisoUSD * minOpeningMargin) / LOAN_SCALE;\\n        require(collateralLeft > borrowMargin , "Remaining debt fails to meet minimum margin!");\\n    }\\n```\\n
Entire vault will be frozen and all collateral will be permanently stuck
```\\nfunction getOraclePrice(IAggregatorV3 _priceFeed, int192 _maxPrice, int192 _minPrice) public view returns (uint256 ) {\\n    (\\n        /*uint80 roundID*/,\\n        int signedPrice,\\n        /*uint startedAt*/,\\n        uint timeStamp,\\n        /*uint80 answeredInRound*/\\n    ) = _priceFeed.latestRoundData();\\n    //check for Chainlink oracle deviancies, force a revert if any are present. Helps prevent a LUNA like issue\\n    require(signedPrice > 0, "Negative Oracle Price");\\n    require(timeStamp >= block.timestamp - HEARTBEAT_TIME , "Stale pricefeed");\\n\\n    //@audit revert if price is outside of immutable bounds\\n    require(signedPrice < _maxPrice, "Upper price bound breached");\\n    require(signedPrice > _minPrice, "Lower price bound breached");\\n    uint256 price = uint256(signedPrice);\\n    return price;\\n}\\n```\\n