Description:
claimFaucetTokens sends Sepolia ETH to msg.sender via a low-level call before updating lastClaimTime and dailyClaimCount. Because the ETH transfer is an external call to the claimer, a malicious contract can reenter claimFaucetTokens from its receive() and perform a second claim in the same transaction, bypassing the 3‑day cooldown and consuming multiple daily claim slots at once. In the reentrant (second) call, no ETH is sent (because hasClaimedEth is already set), but the token transfer still executes.
Impact:
A first‑time claimer can receive 2× faucetDrip in a single transaction, ignoring the 3‑day cooldown.
The dailyClaimLimit check is performed before incrementing dailyClaimCount, so both calls pass the same limit snapshot and count toward the day after the fact. This lets a single tx consume multiple units of the global daily limit.
Proof of Concept:
Mitigation:
Apply Checks‑Effects‑Interactions strictly: update lastClaimTime and dailyClaimCount before any external call.
Add nonReentrant (OpenZeppelin ReentrancyGuard) to claimFaucetTokens.
Prefer a pull pattern for ETH (record entitlement and let user withdraw), avoiding arbitrary external calls in the claim path.
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.