Under normal behavior, the dailyDrips counter should continuously track the amount of Sepolia ETH distributed and reset only once per 24-hour cycle. This mechanism is designed to enforce the dailySepEthCap. The issue is that the dailyDrips counter is incorrectly reset to 0 inside the else block of the claimFaucetTokens() function. This bug is triggered whenever a user who has already claimed ETH attempts to claim it again, allowing attackers to bypass the daily limit and drain the faucet's funds.
Likelihood:
The attack can be triggered by any previously claimed address, making a repeat call; no special permissions or timing are required.
The exploit can be easily automated with a script that makes alternating calls from two or more wallets.
Impact:
The daily ETH limit (dailySepEthCap) becomes meaningless, as it can be repeatedly reset.
The faucet's entire ETH balance can be fully drained in a short amount of time.
Only reset dailyDrips at a fixed daily interval (e.g., midnight UTC).
Track hasClaimedEth globally for daily limit.
Track hasClaimedEth per user with lastClaimTime to enforce a 3-day cooldown.
Allow claims regardless of contract ETH balance.
Limit ETH sent per claim to the available balance; revert or skip if insufficient.
No check on contract vs EOAs.
Optionally restrict ETH claims to externally owned accounts (EOAs) only using require(msg.sender == tx.origin).
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.