Normal behavior: The faucet should reset its per-day counters on a predictable daily boundary (for example, a day-index such as UTC calendar day or a consistent 24-hour bucket). Each reset must be deterministic and not controllable by a caller, so limits like dailyDrips and dailyClaimCount enforce the intended per-day caps fairly for all users.
Specific issue: the contract records the reset time using an absolute timestamp (e.g. lastFaucetDripDay = block.timestamp) and/or mixes timestamp-based resets with day-index-based checks. This turns the “day” into a sliding 24‑hour window that an on-chain actor can intentionally trigger at an advantageous time, thereby moving the next reset to a chosen timestamp + 24h and enabling coordinated abuse around that new window.
Likelihood:High
An on-chain actor triggers a faucet drip (or otherwise causes the reset path to execute) at time T deliberately, making the next reset occur at T + 24 hours — this will happen whenever a transaction executes the reset-branch around the attacker’s chosen time.
Coordinated actors (multiple addresses or timed scripts) submit many claims concentrated around the sliding-window start times that they control, maximizing the amount claimable during each engineered 24‑hour window. This pattern is easy to schedule on-chain or via bots.
Impact:High
The per-day throttling mechanism becomes manipulable: attackers can concentrate claims to capture a disproportionate share of the daily cap, violating fairness and intended limits.
In combination with other vulnerabilities (for example, reentrancy or missing per-user checks), this can materially increase funds/tokens an attacker can obtain in practice. Even by itself it enables predictable exploitation and undermines guarantee of “one fair reset per calendar day.”
lastFaucetDripDay is stored in contract storage and, in this codebase, declared public. That means anyone can directly read the current value via the generated getter (contract.lastFaucetDripDay()) or by reading the contract storage slot with RPC (eth_getStorageAt). Because the value is public and easily accessible, attackers and bots can precisely schedule reset-triggering calls and coordinated claim bursts.
Quick examples:
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.