Snow lets users earn 1 free Snow per week via earnSnow, rate-limited by a timer. But the timer is a single global storage variable, not a per-user mapping:
buySnow also writes s_earnTimer = block.timestamp. Because the timer is shared, the moment any address calls earnSnow (or buySnow), the one-week lockout applies to all users, regardless of whether a given user has ever earned.
Likelihood: High â triggering it is trivial and permissionless: a single earnSnow call per week by any one address keeps the timer perpetually fresh. It is also hit accidentally in normal use (any active user blocks all others).
Impact: Low â this is a griefing / availability issue on the free-earn faucet. No funds are lost and the lock auto-clears after a week; users can still obtain Snow via buySnow.
One address can indefinitely deny every other user the ability to earn free Snow: by calling earnSnow once per week, the global timer never lets anyone else past the S__Timer check. The weekly free-earn feature is effectively DoS'd for the whole user base.
The following Foundry test passes. Alice earns, which sets the global timer; Bob â who has never earned â is then blocked within the same week:
Track the timer per user:
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.