function claimFaucetTokens() public {
if (balanceOf(address(this)) <= faucetDrip) {
revert RaiseBoxFaucet_InsufficientContractBalance();
}
@> if (dailyClaimCount >= dailyClaimLimit) {
@> revert RaiseBoxFaucet_DailyClaimLimitReached();
@> }
* @param lastFaucetDripDay tracks the last day a claim was made
* @notice resets the @param dailyClaimCount every 24 hours
*/
@> if (block.timestamp > lastFaucetDripDay + 1 days) {
@> lastFaucetDripDay = block.timestamp;
@> dailyClaimCount = 0;
@> }
lastClaimTime[faucetClaimer] = block.timestamp;
@> dailyClaimCount++;
_transfer(address(this), faucetClaimer, faucetDrip);
emit Claimed(msg.sender, faucetDrip);
}
pragma solidity ^0.8.30;
import {Test, console} from "forge-std/Test.sol";
import {RaiseBoxFaucet} from "../src/RaiseBoxFaucet.sol";
contract FaucetFreezeTest is Test {
RaiseBoxFaucet public faucet;
address public owner = makeAddr("owner");
function setUp() public {
vm.startPrank(owner);
faucet = new RaiseBoxFaucet(
"TestToken",
"TEST",
1000 * 10**18,
0.005 ether,
0.1 ether
);
vm.deal(address(faucet), 10 ether);
vm.stopPrank();
}
function testFaucetPermanentFreeze() public {
for (uint256 i = 1; i <= 100; i++) {
address user = makeAddr(string(abi.encodePacked("user", i)));
vm.prank(user);
faucet.claimFaucetTokens();
vm.warp(block.timestamp + 3 days + 1);
}
console.log("Daily claim count after 100 claims:", faucet.dailyClaimCount());
assertEq(faucet.dailyClaimCount(), 100);
address user101 = makeAddr("user101");
vm.prank(user101);
vm.expectRevert(RaiseBoxFaucet.RaiseBoxFaucet_DailyClaimLimitReached.selector);
faucet.claimFaucetTokens();
vm.warp(block.timestamp + 2 days);
address newDayUser = makeAddr("newDayUser");
vm.prank(newDayUser);
vm.expectRevert(RaiseBoxFaucet.RaiseBoxFaucet_DailyClaimLimitReached.selector);
faucet.claimFaucetTokens();
console.log("Daily claim count after 24+ hours:", faucet.dailyClaimCount());
assertEq(faucet.dailyClaimCount(), 100);
vm.warp(block.timestamp + 10 days);
address futureUser = makeAddr("futureUser");
vm.prank(futureUser);
vm.expectRevert(RaiseBoxFaucet.RaiseBoxFaucet_DailyClaimLimitReached.selector);
faucet.claimFaucetTokens();
console.log("CONTRACT IS PERMANENTLY FROZEN");
}
}
function claimFaucetTokens() public {
faucetClaimer = msg.sender;
+ // Reset day at function start so the limit check reflects the new day
+ if (block.timestamp > lastFaucetDripDay + 1 days) {
+ lastFaucetDripDay = block.timestamp;
+ dailyClaimCount = 0;
+ }
- if (dailyClaimCount >= dailyClaimLimit) {
+ if (dailyClaimCount >= dailyClaimLimit) {
revert RaiseBoxFaucet_DailyClaimLimitReached();
}
// ... ETH drip branch ...
- if (block.timestamp > lastFaucetDripDay + 1 days) {
- lastFaucetDripDay = block.timestamp;
- dailyClaimCount = 0;
- }
lastClaimTime[faucetClaimer] = block.timestamp;
dailyClaimCount++;
_transfer(address(this), faucetClaimer, faucetDrip);
}