Vault.blacklistProtocol can revert in emergency
Vault.blacklistProtocol can revert in emergency, because it tries to withdraw underlying balance from protocol, which can revert for many reasons after it's hacked or paused.\\n```\\n  function blacklistProtocol(uint256 _protocolNum) external onlyGuardian {\\n    uint256 balanceProtocol = balanceUnderlying(_protocolNum);\\n    currentAllocations[_protocolNum] = 0;\\n    controller.setProtocolBlacklist(vaultNumber, _protocolNum);\\n    savedTotalUnderlying -= balanceProtocol;\\n    withdrawFromProtocol(_protocolNum, balanceProtocol);\\n  }\\n```\\n\\nThe problem is that this function is trying to withdraw all balance from protocol. This can create problems as in case of hack, attacker can steal funds, pause protocol and any other things that can make `withdrawFromProtocol` function to revert. Because of that it will be not possible to add protocol to blacklist and as result system will stop working correctly.
Provide `needToWithdraw` param to the `blacklistProtocol` function. In case if it's safe to withdraw, then withdraw, otherwise, just set protocol as blacklisted. Also you can call function with `true` param again, once it's safe to withdraw. Example of hack situation flow: 1.underlying vault is hacked 2.you call setProtocolBlacklist("vault", false) which blacklists vault 3.in next tx you call setProtocolBlacklist("vault", true) and tries to withdraw
Hacked or paused protocol can't be set to blacklist.
```\\n  function blacklistProtocol(uint256 _protocolNum) external onlyGuardian {\\n    uint256 balanceProtocol = balanceUnderlying(_protocolNum);\\n    currentAllocations[_protocolNum] = 0;\\n    controller.setProtocolBlacklist(vaultNumber, _protocolNum);\\n    savedTotalUnderlying -= balanceProtocol;\\n    withdrawFromProtocol(_protocolNum, balanceProtocol);\\n  }\\n```\\n