pragma solidity ^0.8.30;
import {Test, console2} from "../lib/lib/forge-std/src/Test.sol";
import {RaiseBoxFaucet} from "../src/RaiseBoxFaucet.sol";
contract RaiseBoxFaucetVulnerabilityTest is Test {
RaiseBoxFaucet public faucet;
address public owner;
address public user1;
address public user2;
function advanceBlockTime(uint256 duration_) internal {
vm.warp(duration_);
}
function setUp() public {
owner = makeAddr("owner");
user1 = makeAddr("user1");
user2 = makeAddr("user2");
vm.prank(owner);
faucet = new RaiseBoxFaucet(
"RaiseBoxToken",
"RBT",
1000 * 10**18,
0.005 ether,
1 ether
);
vm.deal(address(faucet), 10 ether);
advanceBlockTime(3 days);
}
function test_InconsistentDailyReset_ETHResetsAtMidnight_ButTokensDoNot() public {
vm.prank(owner);
faucet.adjustDailyClaimLimit(99, false);
uint256 dayStart = (block.timestamp / 1 days) * 1 days;
uint256 justBeforeMidnight = dayStart + 1 days - 60;
vm.warp(justBeforeMidnight);
uint256 ethDrip = faucet.sepEthAmountToDrip();
uint256 preUser1Eth = user1.balance;
vm.prank(user1);
faucet.claimFaucetTokens();
assertEq(faucet.dailyClaimCount(), 1, "token daily count should be 1 after late claim");
assertEq(user1.balance - preUser1Eth, ethDrip, "user1 received the first-time ETH drip");
uint256 justAfterMidnight = dayStart + 1 days + 1;
vm.warp(justAfterMidnight);
vm.expectRevert(RaiseBoxFaucet.RaiseBoxFaucet_DailyClaimLimitReached.selector);
vm.prank(user2);
faucet.claimFaucetTokens();
vm.prank(owner);
faucet.adjustDailyClaimLimit(1, true);
uint256 preUser2Eth = user2.balance;
vm.prank(user2);
faucet.claimFaucetTokens();
assertEq(faucet.dailyClaimCount(), 2, "token daily count continued across midnight (no reset)");
assertEq(user2.balance - preUser2Eth, ethDrip, "user2 received ETH after midnight");
}
}
Use this function for both ETH and claim resets.