In the claimFaucetTokens() function, the daily claim counter reset logic relies on an absolute timestamp comparison instead of a normalized day index.
This condition fails to reset dailyClaimCount when a new claim occurs exactly 24 hours (86400 seconds) after the previous claim — because the comparison is strictly > instead of >=.
As a result, the daily claim limit may persist into the next day for one extra claim cycle, violating the intended 24-hour reset rule.
Likelihood: Medium
| Factor | Observation | Likelihood Influence |
|---|---|---|
| Frequency | Happens whenever claims are made near 24-hour boundaries | High |
| Severity | Moderate (logical inconsistency, not loss of funds) | Medium |
| Complexity | Simple deterministic bug | High |
| Detection | Hard to notice without time-based fuzzing | Medium |
Impact: Medium
| Impact Area | Description |
|---|---|
| Functionality | Daily reset logic may fail, causing users to be blocked from claiming for up to 24h past the intended limit. |
| Fairness | Users who claim slightly later might be unfairly restricted due to boundary conditions. |
| Usability | Faucet becomes unreliable around daily reset times. |
| Consistency | The daily claim limit enforcement becomes unpredictable. |
Claim once at time t0.
Advance block.timestamp to t0 + 1 days (exactly +86400 seconds) and call claimFaucetTokens() again.
Observe whether dailyClaimCount was reset or not.
If the contract uses if (block.timestamp > lastFaucetDripDay + 1 days) with lastFaucetDripDay = t0, then at t0 + 1 days the condition is false (not >), so reset will not occur, and dailyClaimCount may not be reset as intended.
Instead of comparing absolute timestamps, normalize to day indices by using integer division for deterministic day calculation
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.