buySnow() accepts msg.value in ETH even when the caller chooses the WETH payment branch (msg.value == 0 is not enforced, and excess ETH is never refunded).
collectFee() transfers address(this).balance to s_feeCollector without tracking s_feeCollected, draining any accidentally sent ETH alongside protocol fees.
Likelihood: Medium
Any user who accidentally attaches msg.value while paying via WETH (or overpays msg.value != fee) loses their ETH into the contract balance.
Impact: Medium
Unrefunded msg.value is permanently trapped from the user and swept to s_feeCollector on the next collectFee() call.
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.