The Snow::buySnow
function contains a critical flaw where it resets a global timer (s_earnTimer)
to the current block timestamp on every invocation. This timer controls eligibility for free token claims via Snow::earnSnow()
, which requires 1 week to pass since the last timer reset. As a result:
Any token purchase (via buySnow)
blocks all free claims for all users for 7 days
Malicious actors can permanently suppress free claims with micro-transactions
Contradicts protocol documentation promising "free weekly claims per user"
Complete Denial-of-Service: Free claim mechanism becomes unusable
Broken Protocol Incentives: Undermines core user acquisition strategy
Economic Damage: Eliminates promised free distribution channel
Reputation Harm: Users perceive protocol as dishonest
Likelihood:
• Triggered by normal protocol usage (any purchase)
• Requires only one transaction every 7 days to maintain blockage
• Incentivized attack (low-cost disruption)
Impact:
• Permanent suppression of core protocol feature
• Loss of user trust and adoption
• Violates documented tokenomics
Attack Scenario: Permanent Free Claim Suppression
Attacker calls buySnow(1) with minimum payment
s_earnTimer sets to current timestamp (T0)
All earnSnow() calls revert for next 7 days
On day 6, attacker repeats buySnow(1)
New timer reset (T1 = T0+6 days)
Free claims blocked until T1+7 days (total 13 days)
Repeat step 4 every 6 days → permanent blockage
Test Case:
Step 1: Remove Global Timer Reset from buySnow
Step 2: Implement Per-User Timer in earnSnow
Step 3: Initialize First Claim (Constructor)
When buySnow is successfully called, the global timer is reset. This inadvertently affects the earning of snow as that particular action also depends on the global timer.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.