Vulnerability: `rebalanceLite` should provide a slippage protection
Severity: medium

Description:
Users can lose funds while rebalancing.\\nThe protocol provides two kinds of rebalancing functions - `rebalance()` and `rebalanceLite()`. While the function `rebalance()` is protected from an unintended slippage because the caller can specify `amountOutMinimum`, `rebalanceLite()` does not have this protection. This makes the user vulnerable to unintended slippage due to various scenarios.\\n```\\nPerpDepository.sol\\n    function rebalanceLite(\\n        uint256 amount,\\n        int8 polarity,\\n        uint160 sqrtPriceLimitX96,\\n        address account\\n    ) external nonReentrant returns (uint256, uint256) {\\n        if (polarity == -1) {\\n            return\\n                _rebalanceNegativePnlLite(amount, sqrtPriceLimitX96, account);\\n        } else if (polarity == 1) {\\n            // disable rebalancing positive PnL\\n            revert PositivePnlRebalanceDisabled(msg.sender);\\n            // return _rebalancePositivePnlLite(amount, sqrtPriceLimitX96, account);\\n        } else {\\n            revert InvalidRebalance(polarity);\\n        }\\n    }\\n    function _rebalanceNegativePnlLite(\\n        uint256 amount,\\n        uint160 sqrtPriceLimitX96,\\n        address account\\n    ) private returns (uint256, uint256) {\\n        uint256 normalizedAmount = amount.fromDecimalToDecimal(\\n            ERC20(quoteToken).decimals(),\\n            18\\n        );\\n        _checkNegativePnl(normalizedAmount);\\n        IERC20(quoteToken).transferFrom(account, address(this), amount);\\n        IERC20(quoteToken).approve(address(vault), amount);\\n        vault.deposit(quoteToken, amount);\\n        bool isShort = false;\\n        bool amountIsInput = true;\\n        (uint256 baseAmount, uint256 quoteAmount) = _placePerpOrder(\\n            normalizedAmount,\\n            isShort,\\n            amountIsInput,\\n            sqrtPriceLimitX96\\n        );\\n        vault.withdraw(assetToken, baseAmount);\\n        IERC20(assetToken).transfer(account, baseAmount);\\n        emit Rebalanced(baseAmount, quoteAmount, 0);\\n        return (baseAmount, quoteAmount);\\n    }\\n```\\n\\nEspecially, according to the communication with the PERP dev team, it is possible for the Perp's ClearingHouse to fill the position partially when the price limit is specified (sqrtPriceLimitX96). It is also commented in the Perp contract comments here.\\n```\\n    /// @param sqrtPriceLimitX96 tx will fill until it reaches this price but WON'T REVERT\\n    struct InternalOpenPositionParams {\\n        address trader;\\n        address baseToken;\\n        bool isBaseToQuote;\\n        bool isExactInput;\\n        bool isClose;\\n        uint256 amount;\\n        uint160 sqrtPriceLimitX96;\\n    }\\n```\\n\\nSo it is possible that the order is not placed to the full `amount`. As we can see in the #L626~#L628, the UXD protocol grabs the quote token of `amount` and deposits to the Perp's vault. And the unused `amount` will remain in the Perp vault while this is supposed to be returned to the user who called this rebalance function.

Impact:
Users can lose funds while lite rebalancing.

Recommended mitigation:
Add a protection parameter to the function `rebalanceLite()` so that the user can specify the minimum out amount.