```\nfunction requestWithdrawal(uint256 \_tokensToWithdraw) external override {\n  WithdrawalStatus \_status = getWithdrawalStatus(msg.sender);\n\n  require(\_status == WithdrawalStatus.NONE || \_status == WithdrawalStatus.EXPIRED,\n    "PB: Can't request withdrawal");\n\n  uint256 \_daiTokensToWithdraw = \_tokensToWithdraw.mul(getDAIToDAIxRatio()).div(PERCENTAGE\_100);\n  uint256 \_availableDaiBalance = balanceOf(msg.sender).mul(getDAIToDAIxRatio()).div(PERCENTAGE\_100);\n\n  if (block.timestamp < liquidityMining.getEndLMTime().add(neededTimeAfterLM)) {\n    \_availableDaiBalance = \_availableDaiBalance.sub(liquidityFromLM[msg.sender]);\n  }\n\n  require(totalLiquidity >= totalCoverTokens.add(\_daiTokensToWithdraw),\n    "PB: Not enough liquidity");\n\n  require(\_availableDaiBalance >= \_daiTokensToWithdraw, "PB: Wrong announced amount");\n\n  WithdrawalInfo memory \_newWithdrawalInfo;\n  \_newWithdrawalInfo.amount = \_tokensToWithdraw;\n  \_newWithdrawalInfo.readyToWithdrawDate = block.timestamp.add(withdrawalPeriod);\n\n  withdrawalsInfo[msg.sender] = \_newWithdrawalInfo;\n  emit RequestWithdraw(msg.sender, \_tokensToWithdraw, \_newWithdrawalInfo.readyToWithdrawDate);\n}\n```\n