The faucet tracks how much Sepolia ETH has been dripped in the current calendar day using dailyDrips. It should only reset dailyDrips when the day changes and must enforce dailySepEthCap so the ETH distributed in a single day never exceeds the cap.
Inside claimFaucetTokens(), the code resets dailyDrips to 0 whenever the caller is not eligible for the first‑time ETH drip or when drips are paused. This unconditional reset allows attackers to zero the daily counter at will, enabling additional first‑time claimers to receive ETH beyond the daily cap in the same day.
Likelihood: High
Whenever a previously ETH‑paid address calls claimFaucetTokens() later in the same day (using reentrancy described in my other report), the else branch executes and resets dailyDrips to 0.
Whenever drips are paused, any call to claimFaucetTokens() triggers the same else branch reset, zeroing the counter.
Impact: High
Daily cap bypass: After the counter is reset, additional first‑time claimers can receive ETH beyond dailySepEthCap in that calendar day.
Accelerated ETH depletion: Attackers can orchestrate repeated resets and fresh claimers to drain the contract’s ETH.
In the test directory create file PocEthDripsCapBypass.t.sol
Copy bellow code and run forge test --mt testDrainRaiseBoxFaucetEth -vv
Do not reset the daily ETH counter for non-first-time claimants or when drips are paused.
Only reset on day rollover (already correctly handled above using the day bucket).
See mitigations for reentrancy in my Reentrancy in claimFaucetTokens() enables double token claims in a single tx report.
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.
The contest is complete and the rewards are being distributed.