function test_claimFaucetTokens_IncosistentTimeCalculation() public {
uint256 dayInSecs = 24 * 60 * 60;
uint256 fiveMinsInSecs = 5 * 60;
uint256 tenMinsInSecs = 10 * 60;
uint256 startDay = 4 * dayInSecs;
vm.warp(startDay - fiveMinsInSecs);
vm.prank(user1);
raiseBoxFaucet.claimFaucetTokens();
uint256 dailyEthDripsAmountBeforeMidnight = raiseBoxFaucet.dailyDrips();
uint256 dailyEthDripsCountBeforeMidnight = dailyEthDripsAmountBeforeMidnight / raiseBoxFaucet.sepEthAmountToDrip();
uint256 dailyTokenClaimsBeforeMidnight = raiseBoxFaucet.dailyClaimCount();
assertTrue(dailyEthDripsCountBeforeMidnight == dailyTokenClaimsBeforeMidnight);
vm.warp(startDay + tenMinsInSecs);
vm.prank(user2);
raiseBoxFaucet.claimFaucetTokens();
uint256 dailyEthDripsAmountAfterMidnight = raiseBoxFaucet.dailyDrips();
uint256 dailyEthDripsCountAfterMidnight = dailyEthDripsAmountAfterMidnight / raiseBoxFaucet.sepEthAmountToDrip();
uint256 dailyTokenClaimsAfterMidnight = raiseBoxFaucet.dailyClaimCount();
assertTrue(dailyEthDripsCountAfterMidnight < dailyTokenClaimsAfterMidnight);
assertTrue(dailyTokenClaimsAfterMidnight == 2);
}
Use a consistent time measurement by binning the claims in their respective 24 hour window as is done for the dailyDrips variable:
function claimFaucetTokens() public {
+ uint256 currentDay = block.timestamp / 24 hours;
+ if (currentDay > lastDripDay) {
+ lastDripDay = currentDay;
+ dailyDrips = 0;
+ dailyClaimCount = 0;
+ }
faucetClaimer = msg.sender;
// (lastClaimTime[faucetClaimer] == 0);
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();
}
// still checks
if (!hasClaimedEth[faucetClaimer] && !sepEthDripsPaused) {
- uint256 currentDay = block.timestamp / 24 hours;
- if (currentDay > lastDripDay) {
- lastDripDay = currentDay;
- dailyDrips = 0;
- // dailyClaimCount = 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;
}
/**
*
* @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;
- }
// Effects
lastClaimTime[faucetClaimer] = block.timestamp;
dailyClaimCount++;
// Interactions
_transfer(address(this), faucetClaimer, faucetDrip);
emit Claimed(msg.sender, faucetDrip);
}
There is also no need to use to different variables for tracking the last drip day.
Simplifiy the following variables:
lastDripDay, lastFaucetDripDay
to one unified variable: lastClaimDay.