transfer/transferFrom/approve are called on a plain IERC20 and the boolean result is neither checked nor routed through SafeERC20. Tokens that return false on failure (or nothing at all, like USDT) break the contract's assumptions — a failed transfer looks like success, or a compliant require reverts on USDT.
// token.transfer(user, amt); // USDT returns no bool -> some compilers // treat as success even if it failed; or require(token.transfer(...)) // reverts against USDT which returns void. Either way funds/logic break.
using SafeERC20 for IERC20; token.safeTransfer(to, amount); token.safeTransferFrom(from, to, amount);
The SaferICO scanner runs 201 detectors over your Solidity source, SAFE-0208 among them. Paste an address or the source itself — a small per-scan fee, shown before you sign, or unlimited on any plan.