pragma solidity ^0.8.30;
import {Test, console} from "../lib/lib/forge-std/src/Test.sol";
import {RaiseBoxFaucet} from "../src/RaiseBoxFaucet.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {DeployRaiseboxContract} from "../script/DeployRaiseBox.s.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract TestRaiseBoxFaucet is Test {
RaiseBoxFaucet raiseBoxFaucet;
DeployRaiseboxContract raiseBoxDeployer;
address user1 = makeAddr("user1");
address user2 = makeAddr("user2");
address user3 = makeAddr("user3");
address user4 = makeAddr("user4");
address user5 = makeAddr("user5");
address user6 = makeAddr("user6");
address user7 = makeAddr("user 7");
address user8 = makeAddr("user 8");
address user9 = makeAddr("user 9");
address user10 = makeAddr("user 10");
address user11 = makeAddr("user 11");
address user12 = makeAddr("user 12");
address owner;
address raiseBoxFaucetContractAddress;
uint256 public constant INITIAL_SUPPLY_MINTED = 1000000000 * 10 ** 18;
* @dev Helper function to simulate time passing since testing environment doesn't work as expected
* @param duration_ amount of time to advanced, could be in days, hours, minutes or seconds. default is seconds*
*/
function advanceBlockTime(uint256 duration_) internal {
vm.warp(duration_);
}
function setUp() public {
owner = address(this);
raiseBoxFaucet = new RaiseBoxFaucet(
"raiseboxtoken",
"RB",
1000 * 10 ** 18,
0.005 ether,
0.5 ether
);
raiseBoxFaucetContractAddress = address(raiseBoxFaucet);
raiseBoxDeployer = new DeployRaiseboxContract();
vm.deal(raiseBoxFaucetContractAddress, 1 ether);
vm.deal(owner, 100 ether);
advanceBlockTime(3 days);
}
function testFaucetBalanceIsAlwaysChecksum() public {
address[5] memory claimers = [user1, user2, user3, user4, user5];
uint256 userClaims;
uint256 balanceLeft;
for (uint256 i = 0; i < claimers.length; i++) {
vm.prank(claimers[i]);
raiseBoxFaucet.claimFaucetTokens();
userClaims += raiseBoxFaucet.getBalance(claimers[i]);
balanceLeft = (INITIAL_SUPPLY_MINTED - userClaims);
console.log((balanceLeft + userClaims));
assertTrue(INITIAL_SUPPLY_MINTED == (balanceLeft + userClaims));
}
}
function testOnlyOwnerCanAdjustDailyClaimLimit() public {
vm.prank(owner);
raiseBoxFaucet.adjustDailyClaimLimit(1000, true);
assertTrue(
raiseBoxFaucet.dailyClaimLimit() == 1100,
"Daily claim limit should be 1100"
);
vm.prank(user1);
vm.expectRevert(
abi.encodeWithSelector(
Ownable.OwnableUnauthorizedAccount.selector,
user1
)
);
raiseBoxFaucet.adjustDailyClaimLimit(500, true);
}
function testadjustDailyClaimLimit() public {
console.log(raiseBoxFaucet.dailyClaimLimit());
vm.prank(owner);
raiseBoxFaucet.adjustDailyClaimLimit(500, true);
assertTrue(
raiseBoxFaucet.dailyClaimLimit() == 600,
"Daily claim should increase by 500"
);
console.log(raiseBoxFaucet.dailyClaimLimit());
vm.prank(owner);
raiseBoxFaucet.adjustDailyClaimLimit(500, true);
assertTrue(
raiseBoxFaucet.dailyClaimLimit() == 1100,
"Daily claim should increase by 500"
);
console.log(raiseBoxFaucet.dailyClaimLimit());
vm.prank(owner);
raiseBoxFaucet.adjustDailyClaimLimit(500, false);
assertTrue(
raiseBoxFaucet.dailyClaimLimit() == 600,
"Daily claim should decrease by 500"
);
console.log(raiseBoxFaucet.dailyClaimLimit());
vm.prank(owner);
raiseBoxFaucet.adjustDailyClaimLimit(500, false);
assertTrue(
raiseBoxFaucet.dailyClaimLimit() == 100,
"Daily claim should decrease by 500"
);
console.log(raiseBoxFaucet.dailyClaimLimit());
vm.prank(owner);
vm.expectRevert();
raiseBoxFaucet.adjustDailyClaimLimit(500, false);
console.log(raiseBoxFaucet.dailyClaimLimit());
}
function testOwnerCanMakeDirectSepEthDeposits() public {
vm.prank(owner);
(bool sentSuccess, ) = address(raiseBoxFaucet).call{value: 20 ether}(
abi.encode("owner donated 20 ether to this contract")
);
assertTrue(owner.balance == 80 ether);
assertTrue(address(raiseBoxFaucet).balance == 21 ether);
vm.prank(raiseBoxFaucetContractAddress);
(bool contractSentSuccess, ) = address(raiseBoxFaucet).call{
value: 0.5 ether
}(abi.encode("contract donated 0.5 ether to self"));
assertTrue(owner.balance == 80 ether);
assertTrue(
raiseBoxFaucetContractAddress.balance == 21.0 ether,
"contract cannot send sep eth to self, balance unchanged"
);
}
function testOwnerIsDeployer() public {
raiseBoxDeployer.run();
RaiseBoxFaucet box = raiseBoxDeployer.raiseBox();
assertEq(box.name(), "raiseboxtoken");
assertEq(box.symbol(), "RB");
}
function testMintFailsIfRecepientIsNotContract() public {
vm.prank(owner);
vm.expectRevert();
raiseBoxFaucet.mintFaucetTokens(user1, 100 * 10 ** 18);
}
function testOnly
@root@Monikakeerthana: /mnt/c/Users/Monik/OneDrive/Desktop/cyfrinupdraft/firstflights/2025-10-raisebox-faucet# forge install forge-std
Installing forge-std in /mnt/c/Users/Monik/OneDrive/Desktop/cyfrinupdraft/firstflights/2025-10-raisebox-faucet/lib/forge-std (url: None, tag: None)
Error: dependency forge-std has no url
@root@Monikakeerthana: /mnt/c/Users/Monik/OneDrive/Desktop/cyfrinupdraft/firstflights/2025-10-raisebox-faucet# forge install foundry-rs/forge-std
Installing forge-std in /mnt/c/Users/Monik/OneDrive/Desktop/cyfrinupdraft/firstflights/2025-10-raisebox-faucet/lib/forge-std' (url: Some("https://github.com/foundry-rs/forge-std"), tag: None)
Cloning into '/mnt/c/Users/Monik/OneDrive/Desktop/cyfrinupdraft/firstflights/2025-10-raisebox-faucet/lib/forge-std' ...
remote: Enumerating objects: 2270, done.
remote: Counting objects: 100% (1122/1122), done.
remote: Compressing objects: 100% (177/177), done.
remote: Total 2270 (delta 1034), reused 945 (delta 945), pack-reused 1148 (from 2)
Receiving objects: 100% (2270/2270), 734.99 KiB | 2.87 MiB/s, done.
Resolving deltas: 100% (1519/1519), done.
fatal: please make sure that the .gitmodules file is in the working tree
Error: git submodule exited with code 128