function claimFaucetTokens() public {
faucetClaimer = msg.sender;
if (block.timestamp < (lastClaimTime[faucetClaimer] + CLAIM_COOLDOWN)) {
revert RaiseBoxFaucet_ClaimCooldownOn();
}
if (faucetClaimer == address(0) || faucetClaimer == address(this) || faucetClaimer == Ownable.owner()) {
revert RaiseBoxFaucet_OwnerOrZeroOrContractAddressCannotCallClaim();
}
if (balanceOf(address(this)) <= faucetDrip) {
revert RaiseBoxFaucet_InsufficientContractBalance();
}
if (dailyClaimCount >= dailyClaimLimit) {
revert RaiseBoxFaucet_DailyClaimLimitReached();
}
function testDailyClaimCountResetBug() public {
console.log("=== Test dailyClaimCount reset logic error ===");
uint256 initialClaimCount = raiseBoxFaucet.dailyClaimCount();
uint256 claimLimit = raiseBoxFaucet.dailyClaimLimit();
console.log("Initial dailyClaimCount:", initialClaimCount);
console.log("dailyClaimLimit:", claimLimit);
address[] memory users = new address[](claimLimit);
for (uint256 i = 0; i < claimLimit; i++) {
users[i] = makeAddr(string(abi.encodePacked("user", i)));
}
for (uint256 i = 0; i < claimLimit; i++) {
vm.prank(users[i]);
raiseBoxFaucet.claimFaucetTokens();
uint256 currentCount = raiseBoxFaucet.dailyClaimCount();
console.log("user", i + 1, "dailyClaimCount after claiming:", currentCount);
}
uint256 finalClaimCount = raiseBoxFaucet.dailyClaimCount();
assertEq(finalClaimCount, claimLimit, "should have reached the daily limit");
address nextUser = makeAddr("nextUser");
vm.prank(nextUser);
vm.expectRevert(RaiseBoxFaucet.RaiseBoxFaucet_DailyClaimLimitReached.selector);
raiseBoxFaucet.claimFaucetTokens();
console.log("=== Problem Analysis ===");
console.log("Problem: When dailyClaimCount reaches dailyClaimLimit, ");
console.log("The function directly reverts in lines 179-181, never executing the reset logic in lines 220-223");
vm.warp(block.timestamp + 24 hours + 1 second);
vm.prank(nextUser);
vm.expectRevert(RaiseBoxFaucet.RaiseBoxFaucet_DailyClaimLimitReached.selector);
raiseBoxFaucet.claimFaucetTokens();
console.log("BUG: Even after 24 hours, dailyClaimCount remains", raiseBoxFaucet.dailyClaimCount());
console.log("This means the contract will never be able to resume normal claiming!");
assertEq(raiseBoxFaucet.dailyClaimCount(), claimLimit, "BUG: dailyClaimCount has not been reset");
console.log("Impact: Once the daily limit is reached, the contract will never be able to process new claiming requests");
}
function claimFaucetTokens() public {
faucetClaimer = msg.sender;
// Step 1: Each call first checks whether it spans multiple days, and clears it if necessary
if (block.timestamp > lastFaucetDripDay + 1 days) {
lastFaucetDripDay = block.timestamp;
dailyClaimCount = 0;
}
// Step 2: Limit determination
if (dailyClaimCount >= dailyClaimLimit) {
revert RaiseBoxFaucet_DailyClaimLimitReached();
}