Normal behavior: Per-day counters (for Sepolia ETH drips and ERC20 faucet claims) should use a single, consistent definition of "day" (for example a day index computed as block.timestamp / 1 days). Both dailyDrips and dailyClaimCount must reset at the same canonical day boundary so users get the expected allocation each calendar day.
Specific issue: the contract mixes two different reset semantics. One part of the contract uses a day index (currentDay = block.timestamp / 24 hours) to reset dailyDrips and lastDripDay, while dailyClaimCount is reset using a timestamp comparison against lastFaucetDripDay + 1 days. The two approaches define "day" differently and can de-synchronize, causing users to reach a new calendar day yet still be blocked by stale dailyClaimCount values (or vice versa).
Likelihood:High
A normal user who attempts to claim shortly after a calendar day boundary will encounter inconsistent counter states because one counter has reset (day index logic) while the other has not (timestamp+1 days logic). This will occur during routine daily usage around day boundaries.
Coordinated callers or automated agents may amplify the discrepancy by issuing transactions timed around the different reset behaviors, making it more likely that honest users see unexpected failures.
Impact:Middle
Users may fail to receive the expected ERC20 faucet tokens even after the start of a new day, degrading UX and trust in the faucet.
Users who are blocked by an unreleased dailyClaimCount may still be subject to cooldowns, potentially preventing legitimate use for extended periods and concentrating claims by more active/bot accounts.
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.