if (!hasClaimedEth[faucetClaimer] && !sepEthDripsPaused) {
if (dailyDrips + sepEthAmountToDrip <= dailySepEthCap && address(this).balance >= sepEthAmountToDrip) {
hasClaimedEth[faucetClaimer] = true;
dailyDrips += sepEthAmountToDrip;
if (success) {
emit SepEthDripped(faucetClaimer, sepEthAmountToDrip);
} else {
revert RaiseBoxFaucet_EthTransferFailed();
}
}
}
contract MaliciousReceiver {
RaiseBoxFaucet public faucet;
uint256 public attempts;
constructor(address _faucet) {
faucet = RaiseBoxFaucet(_faucet);
}
receive() external payable {
attempts++;
if (attempts < 2) {
try faucet.claimFaucetTokens() {
} catch {}
}
}
function attack() external {
faucet.claimFaucetTokens();
}
}
function testReentrancyAttempt() public {
MaliciousReceiver attacker = new MaliciousReceiver(address(raiseBoxFaucet));
vm.deal(address(attacker), 0);
vm.prank(address(attacker));
raiseBoxFaucet.claimFaucetTokens();
assertEq(attacker.attempts(), 1);
}
function claimFaucetTokens() public {
+ address claimer = msg.sender;
//
- faucetClaimer = msg.sender;
- if (block.timestamp < (lastClaimTime[faucetClaimer] + CLAIM_COOLDOWN)) {
+ if (block.timestamp < (lastClaimTime[claimer] + CLAIM_COOLDOWN)) {
revert RaiseBoxFaucet_ClaimCooldownOn();
}
// ... other checks ...
+ // Daily reset logic
+ uint256 currentDay = block.timestamp / 24 hours;
+ if (currentDay > lastDripDay) {
+ lastDripDay = currentDay;
+ dailyDrips = 0;
+ }
+ if (currentDay > lastFaucetDripDay) {
+ lastFaucetDripDay = currentDay;
+ dailyClaimCount = 0;
+ }
//
+ lastClaimTime[claimer] = block.timestamp;
+ dailyClaimCount++;
+ bool shouldDripEth = !hasClaimedEth[claimer] &&
+ !sepEthDripsPaused &&
+ dailyDrips + sepEthAmountToDrip <= dailySepEthCap &&
+ address(this).balance >= sepEthAmountToDrip;
+
+ uint256 ethToDrip = 0;
+ if (shouldDripEth) {
+ hasClaimedEth[claimer] = true;
+ dailyDrips += sepEthAmountToDrip;
+ ethToDrip = sepEthAmountToDrip;
+ }
//
+ _transfer(address(this), claimer, faucetDrip);
+ emit Claimed(claimer, faucetDrip);
- if (!hasClaimedEth[faucetClaimer] && !sepEthDripsPaused) {
- // ... logic ...
- hasClaimedEth[faucetClaimer] = true;
- dailyDrips += sepEthAmountToDrip;
-
- (bool success,) = faucetClaimer.call{value: sepEthAmountToDrip}("");
-
- if (success) {
- emit SepEthDripped(faucetClaimer, sepEthAmountToDrip);
- } else {
- revert RaiseBoxFaucet_EthTransferFailed();
- }
- }
-
- lastClaimTime[faucetClaimer] = block.timestamp;
- dailyClaimCount++;
-
- _transfer(address(this), faucetClaimer, faucetDrip);
- emit Claimed(msg.sender, faucetDrip);
+ if (ethToDrip > 0) {
+ (bool success,) = claimer.call{value: ethToDrip}("");
+ if (success) {
+ emit SepEthDripped(claimer, ethToDrip);
+ } else {
+ revert RaiseBoxFaucet_EthTransferFailed();
+ }
+ }
}