The collectFee() function transfers WETH to the fee recipient using a raw .transfer() call. However, SafeERC20 is already imported in the contract and used via safeTransferFrom / safeTransfer in other functions, indicating the codebase convention is to use the Safe wrapper.
The raw .transfer() call works correctly for WETH specifically because WETH's transfer() returns a boolean. However, if the fee token were ever swapped for a non-standard ERC20 that omits the return value (a common pattern in some tokens), the call would silently fail or revert with an unhandled return value.
Likelihood:
This code path only executes when the owner calls collectFee(), limiting exposure to owner-triggered operations.
WETH (the actual fee token) is a standard, well-audited token whose transfer() reliably returns true, so the bug is latent rather than actively exploitable.
Impact:
If the fee token is ever changed to a non-standard ERC20 (e.g., a token that omits the boolean return), the transfer will silently fail and fees will be lost or stuck.
Inconsistent coding style increases the risk of similar oversights in future modifications.
The PoC illustrates that a token omitting the boolean return value would cause safeTransfer() to revert with a clear error, while raw .transfer() would either succeed silently (if the token still moves funds) or revert with an unhelpful error. The inconsistency means the contract is one token swap away from a silent fee-loss bug.
Replacing the raw .transfer() with safeTransfer() (from the already-imported SafeERC20 library) ensures the return value is explicitly checked. This aligns collectFee() with the rest of the contract's conventions and future-proofs the function against non-standard tokens.
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.