Reentrancy window during the ETH faucet drip lets an attacker re-enter claimFaucetTokens and drain funds before cooldown variables are updated.
Under normal conditions the faucet drips Sepolia ETH to first-time claimants, then records the claim time and increments the per-day counters before handing out ERC20 tokens.
Because the function performs the external call{value: ...} before timestamp and counter updates, a malicious contract can regain execution control while the faucet still reflects the pre-claim state.
Likelihood:
Reentrancy occurs whenever the faucet sends ETH to a contract whose receive() function performs another claim before lastClaimTime changes.
The cooldown check still passes on re-entry because the stale lastClaimTime and dailyClaimCount values are read again during the same transaction.
Impact:
Multiple re-entrant calls can exhaust ETH held for drips, denying legitimate users.
The attacker can chain claims to bypass rate limiting and accumulate an outsized share of ERC20 faucet tokens.
This PoC deploys a malicious receiver whose fallback recursively calls claimFaucetTokens, consuming the ETH drip multiple times before the faucet updates cooldown state.
Install the state-update patch so cooldown variables change before the external call, eliminating the reentrancy window described above.
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.