Snow.sol imports SafeERC20 and declares using SafeERC20 for IERC20, but collectFee() calls i_weth.transfer() directly on line 103 instead of using i_weth.safeTransfer(). The transfer() return value is silently discarded. If the WETH transfer fails (returns false), the function continues to send ETH to the collector, and the WETH fees are lost.
Standard WETH returns true on success, so the return value is technically always truthy. But the contract explicitly imported SafeERC20 for this purpose and then didn't use it. With any non-standard ERC20 (some tokens return no value), the transfer() call would succeed at the EVM level but not actually transfer tokens.
Likelihood:
With standard WETH on Ethereum mainnet, the transfer will succeed. The risk materializes if the protocol is deployed with a non-standard WETH wrapper or on a chain with a different WETH implementation.
Impact:
WETH fees silently lost. The collector receives ETH but not WETH. The discrepancy goes undetected because the function doesn't revert.
Use safeTransfer() as intended by the import:
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.