if (!hasClaimedEth[faucetClaimer] && !sepEthDripsPaused) {
uint256 currentDay = block.timestamp / 24 hours;
if (currentDay > lastDripDay) {
lastDripDay = currentDay;
dailyDrips = 0;
}
if (dailyDrips + sepEthAmountToDrip <= dailySepEthCap && address(this).balance >= sepEthAmountToDrip) {
hasClaimedEth[faucetClaimer] = true;
dailyDrips += sepEthAmountToDrip;
(bool success,) = faucetClaimer.call{value: sepEthAmountToDrip}("");
if (success) {
emit SepEthDripped(faucetClaimer, sepEthAmountToDrip);
} else {
revert RaiseBoxFaucet_EthTransferFailed();
}
} else {
emit SepEthDripSkipped(
faucetClaimer,
address(this).balance < sepEthAmountToDrip ? "Faucet out of ETH" : "Daily ETH cap reached"
);
}
} else {
dailyDrips = 0;
}
function testDailyDripsResetBug() public {
console.log("=== Testing dailyDrips reset logic error ===");
uint256 initialDailyDrips = raiseBoxFaucet.dailyDrips();
console.log("Initial dailyDrips:", initialDailyDrips);
vm.prank(user1);
raiseBoxFaucet.claimFaucetTokens();
uint256 afterFirstUser = raiseBoxFaucet.dailyDrips();
console.log("DailyDrips after user1's first claim:", afterFirstUser);
assertEq(afterFirstUser, raiseBoxFaucet.sepEthAmountToDrip(), "The first user should increase their dailyDrips");
vm.prank(user2);
raiseBoxFaucet.claimFaucetTokens();
uint256 afterSecondUser = raiseBoxFaucet.dailyDrips();
console.log("user2's dailyDrips after first claim:", afterSecondUser);
uint256 expectedDrips = raiseBoxFaucet.sepEthAmountToDrip() * 2;
assertEq(afterSecondUser, expectedDrips, "The second user should continue to increase their dailyDrips");
vm.warp(block.timestamp + 3 days);
vm.prank(user1);
raiseBoxFaucet.claimFaucetTokens();
uint256 afterUser1SecondClaim = raiseBoxFaucet.dailyDrips();
console.log("user1's dailyDrips after the second claim:", afterUser1SecondClaim);
assertEq(afterUser1SecondClaim, 0, "BUG: user1's second claim accidentally resets dailyDrips to 0");
console.log("=== Problem Analysis ===");
console.log("Problem: In line 212 of the claimFaucetTokens function, when this is not the user's first claim, ");
console.log("The code executes 'dailyDrips = 0;', which resets the ETH issuance count for that day");
console.log("This means that subsequent first-time claiming users on the same day may receive more ETH than the daily limit");
vm.prank(user3);
raiseBoxFaucet.claimFaucetTokens();
uint256 afterUser3FirstClaim = raiseBoxFaucet.dailyDrips();
console.log("user3's dailyDrips after first claim:", afterUser3FirstClaim);
assertEq(afterUser3FirstClaim, raiseBoxFaucet.sepEthAmountToDrip(), "The third user still receives ETH");
console.log("Impact: This defeats the daily ETH limit protection mechanism");
}
- remove this code
if (!hasClaimedEth[faucetClaimer] && !sepEthDripsPaused) {
uint256 currentDay = block.timestamp / 24 hours;
if (currentDay > lastDripDay) {
lastDripDay = currentDay;
dailyDrips = 0;
}
if (dailyDrips + sepEthAmountToDrip <= dailySepEthCap && address(this).balance >= sepEthAmountToDrip) {
hasClaimedEth[faucetClaimer] = true;
dailyDrips += sepEthAmountToDrip;
(bool success,) = faucetClaimer.call{value: sepEthAmountToDrip}("");
if (success) {
emit SepEthDripped(faucetClaimer, sepEthAmountToDrip);
} else {
revert RaiseBoxFaucet_EthTransferFailed();
}
} else {
emit SepEthDripSkipped(
faucetClaimer,
address(this).balance < sepEthAmountToDrip ? "Faucet out of ETH" : "Daily ETH cap reached"
);
}
}