Normal behavior: When the faucet holds exactly faucetDrip tokens, a user should be allowed to claim those tokens (the faucet should transfer the faucetDrip amount and drop to zero).
Actual behavior: The contract checks the faucet balance using <= faucetDrip and reverts when the faucet balance is equal to faucetDrip, preventing legitimate claims of the final available drip amount and effectively locking those tokens.
Likelihood:
This will occur any time the faucet balance is exactly equal to faucetDrip (e.g., after funding the faucet with a multiple of the drip amount or when one final drip remains). Because funding and drip sizes are often round numbers, the condition is likely to occur in normal operational scenarios.
Impact
1.Users cannot claim a drip when the faucet holds exactly faucetDrip tokens; the faucet becomes unusable until the owner mints or transfers more tokens (even when there are exactly enough tokens to satisfy one claim).
2.This is a denial-of-service for legitimate claimers and may confuse testers or validators expecting the faucet to fully dispense its supply
Fund the faucet with exactly faucetDrip tokens (e.g., transfer 1000 * 10**18 tokens if that is faucetDrip). A normal user calls claimFaucetTokens() and the transaction reverts with RaiseBoxFaucet_InsufficientContractBalance(). After the revert, the faucet still holds the same faucetDrip amount and no claim succeeds until the owner increases the contract balance beyond faucetDrip. This demonstrates the off-by-one check prevents dispensing the exact remaining drip.
}
Fix: Change the comparison to allow equality. Replace <= with < (or use balance < faucetDrip).
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.