function _withdraw(WithdrawParameter memory parameters) private {
IController _ctrl = ctrl;
_ctrl.eoaOnly(msg.sender);
require(_buoy.safetyCheck(), "!safetyCheck");
uint256[N_COINS] memory tokenAmounts;
uint256 virtualPrice = _buoy.getVirtualPrice();
deductUsd = _ctrl.getUserAssets(parameters.pwrd, parameters.account);
returnUsd = deductUsd.sub(deductUsd.mul(withdrawalFee(parameters.pwrd)).div(PERCENTAGE_DECIMAL_FACTOR));
lpAmountFee = returnUsd.mul(DEFAULT_DECIMALS_FACTOR).div(virtualPrice);
uint256 userAssets = _ctrl.getUserAssets(parameters.pwrd, parameters.account);
uint256 lpAmount = parameters.lpAmount;
uint256 fee = lpAmount.mul(withdrawalFee(parameters.pwrd)).div(PERCENTAGE_DECIMAL_FACTOR);
lpAmountFee = lpAmount.sub(fee);
returnUsd = lpAmountFee.mul(virtualPrice).div(DEFAULT_DECIMALS_FACTOR);
deductUsd = lpAmount.mul(virtualPrice).div(DEFAULT_DECIMALS_FACTOR);
require(deductUsd <= userAssets, "!withdraw: not enough balance");
uint256 hodlerBonus = deductUsd.sub(returnUsd);
bool whale = _ctrl.isValidBigFish(parameters.pwrd, false, returnUsd);
if (parameters.balanced) {
(returnUsd, tokenAmounts) = _withdrawBalanced(
(returnUsd, tokenAmounts[parameters.index]) = _withdrawSingle(
parameters.minAmounts[parameters.index],
_ctrl.burnGToken(parameters.pwrd, parameters.all, parameters.account, deductUsd, hodlerBonus);
_ctrl.referrals(parameters.account),