```\nfunction doTransfer(\n    address sender,\n    address recipient,\n    uint amount\n) internal returns (bool) {\n    if (!isAuthorized[sender] && !isAuthorized[recipient]) {\n        require(launched, "VoxNET: transfers not allowed yet");\n    }\n\n    require(balanceOf[sender] >= amount, "VoxNET: insufficient balance");\n\n    balanceOf[sender] = balanceOf[sender] - amount;\n\n    uint amountAfterFee = amount;\n\n    if (!distributingFee) {\n        if ((isPool[sender] && !isFeeExempt[recipient]) || (isPool[recipient] && !isFeeExempt[sender])) {\n            amountAfterFee = takeFee(sender, amount);\n        } else {\n            distributeFeeIfApplicable(amount);\n        }\n    }\n\n    balanceOf[recipient] = balanceOf[recipient] + amountAfterFee;\n\n    emit Transfer(sender, recipient, amountAfterFee);\n    return true;\n}\n```\n