```\nfunction _sell(\n    uint256 tokenAmount,\n    uint256 deadline,\n    uint256 minBNBOut\n) public nonReentrant returns (bool) {\n    // deadline requirement\n    require(deadline >= block.timestamp, "Deadline EXPIRED");\n\n    //Frontrun Guard\n    require(\n        _lastBuyBlock[msg.sender] != block.number,\n        "Buying and selling in the same block is not allowed!"\n    );\n\n    address seller = msg.sender;\n\n    // make sure seller has this balance\n    require(\n        _balances[seller] >= tokenAmount,\n        "cannot sell above token amount"\n    );\n\n    // get how much beans are the tokens worth\n    uint256 amountBNB = liquidity -\n        (liqConst / (_balances[address(this)] + tokenAmount));\n    uint256 amountTax = (amountBNB * (DIVISOR - sellMul)) / DIVISOR;\n    uint256 BNBToSend = amountBNB - amountTax;\n\n    //slippage revert\n    require(amountBNB >= minBNBOut, "INSUFFICIENT OUTPUT AMOUNT");\n\n    // send BNB to Seller\n    (bool successful, ) = isFeeExempt[msg.sender]\n        ? payable(seller).call{value: amountBNB}("")\n        : payable(seller).call{value: BNBToSend}("");\n    require(successful, "BNB/ETH transfer failed");\n\n    // subtract full amount from sender\n    _balances[seller] = _balances[seller] - tokenAmount;\n\n    //add tax allowance to be withdrawn and remove from liq the amount of beans taken by the seller\n    taxBalance = isFeeExempt[msg.sender]\n        ? taxBalance\n        : taxBalance + amountTax;\n    liquidity = liquidity - amountBNB;\n\n    // add tokens back into the contract\n    _balances[address(this)] = _balances[address(this)] + tokenAmount;\n\n    //update volume\n    uint256 cTime = block.timestamp;\n    uint256 dollarSell = amountBNB * getBNBPrice();\n    totalVolume += dollarSell;\n    indVol[msg.sender] += dollarSell;\n    tVol[cTime] += dollarSell;\n\n    //update candleStickData\n    totalTx += 1;\n    txTimeStamp[totalTx] = cTime;\n    uint256 cPrice = calculatePrice() * getBNBPrice();\n    candleStickData[cTime].time = cTime;\n    if (candleStickData[cTime].open == 0) {\n        candleStickData[cTime].open = candleStickData[\n            txTimeStamp[totalTx - 1]\n        ].close;\n    }\n    candleStickData[cTime].close = cPrice;\n\n    if (\n        candleStickData[cTime].high < cPrice ||\n        candleStickData[cTime].high == 0\n    ) {\n        candleStickData[cTime].high = cPrice;\n    }\n\n    if (\n        candleStickData[cTime].low > cPrice ||\n        candleStickData[cTime].low == 0\n    ) {\n        candleStickData[cTime].low = cPrice;\n    }\n\n    // emit transfer and sell events\n    emit Transfer(seller, address(this), tokenAmount);\n    if (isFeeExempt[msg.sender]) {\n        emit Sold(\n            address(this),\n            msg.sender,\n            tokenAmount,\n            amountBNB,\n            dollarSell\n        );\n    } else {\n        emit Sold(\n            address(this),\n            msg.sender,\n            tokenAmount,\n            BNBToSend,\n            BNBToSend * getBNBPrice()\n        );\n    }\n    return true;\n}\n```\n