import {console2} from "forge-std/Test.sol";
import {BaseTest} from "./BaseTest.t.sol";
import {Soulmate} from "../../src/Soulmate.sol";
import {ERC721} from "@solmate/tokens/ERC721.sol";
import {IVault} from "../../src/interface/IVault.sol";
import {ISoulmate} from "../../src/interface/ISoulmate.sol";
import {ILoveToken} from "../../src/interface/ILoveToken.sol";
import {IStaking} from "../../src/interface/IStaking.sol";
import {Vault} from "../../src/Vault.sol";
import {LoveToken} from "../../src/LoveToken.sol";
import {Airdrop} from "../../src/Airdrop.sol";
import {Staking} from "../../src/Staking.sol";
function testAirdropOutOfFunds() public {
Vault airdropVault_tst = new Vault();
Vault stakingVault_tst = new Vault();
Soulmate soulmateContract_tst = new Soulmate();
LoveToken loveToken_tst = new LoveToken(
ISoulmate(address(soulmateContract_tst)), address(airdropVault_tst), address(stakingVault_tst)
);
Airdrop airdropContract_tst = new Airdrop(
ILoveToken(address(loveToken_tst)),
ISoulmate(address(soulmateContract_tst)),
IVault(address(airdropVault_tst))
);
airdropVault_tst.initVault(ILoveToken(address(loveToken_tst)), address(airdropContract_tst));
vm.expectRevert();
airdropVault_tst.initVault(ILoveToken(address(loveToken_tst)), address(airdropContract_tst));
uint256 totalSupply_one = loveToken_tst.totalSupply();
uint256 airdropVaultBalance = loveToken_tst.balanceOf(address(airdropVault_tst));
uint256 airdropAsManagerSpendAllowance =
loveToken_tst.allowance(address(airdropVault_tst), address(airdropContract_tst));
console2.log("total supply : ", totalSupply_one);
console2.log("airdropVaultBalance : ", airdropVaultBalance);
console2.log("airdropAsManagerSpendAllowance : ", airdropAsManagerSpendAllowance);
address alice = makeAddr("ALICE");
address bob = makeAddr("BOB");
address charlie = makeAddr("CHARLIE");
address darci = makeAddr("DARCI");
vm.startPrank(alice);
soulmateContract_tst.mintSoulmateToken();
vm.stopPrank();
vm.startPrank(bob);
soulmateContract_tst.mintSoulmateToken();
vm.stopPrank();
vm.startPrank(charlie);
soulmateContract_tst.mintSoulmateToken();
vm.stopPrank();
vm.startPrank(darci);
soulmateContract_tst.mintSoulmateToken();
vm.stopPrank();
uint256 aliceId = soulmateContract_tst.ownerToId(alice);
uint256 bobId = soulmateContract_tst.ownerToId(bob);
uint256 charlieId = soulmateContract_tst.ownerToId(charlie);
uint256 darciId = soulmateContract_tst.ownerToId(darci);
console2.log("Alice minted with ID : ", aliceId);
console2.log("Bob minted with ID : ", bobId);
console2.log("Charlie minted with ID : ", charlieId);
console2.log("Darci minted with ID : ", darciId);
console2.log("Soulmate of Alice : ", soulmateContract_tst.soulmateOf(alice));
console2.log("Soulmate of Bob : ", soulmateContract_tst.soulmateOf(bob));
console2.log("Soulmate of charlie : ", soulmateContract_tst.soulmateOf(charlie));
console2.log("Soulmate of darci : ", soulmateContract_tst.soulmateOf(darci));
uint256 oneDaysInSecond = airdropContract_tst.daysInSecond();
console2.log("---------------------------1 Day---------------------------");
vm.warp(block.timestamp + oneDaysInSecond);
vm.startPrank(alice);
airdropContract_tst.claim();
vm.stopPrank();
uint256 aliceLoveTokenBalance = loveToken_tst.balanceOf(alice);
uint256 totalSupply_updated = loveToken_tst.totalSupply();
uint256 airdropVaultBalance_updated = loveToken_tst.balanceOf(address(airdropVault_tst));
uint256 airdropAsManagerSpendAllowance_updated =
loveToken_tst.allowance(address(airdropVault_tst), address(airdropContract_tst));
console2.log("seconds in one day : ", oneDaysInSecond);
console2.log("total supply Updated : ", totalSupply_updated);
console2.log("aliceLoveTokenBalance : ", aliceLoveTokenBalance);
console2.log("airdropVaultBalance Updated : ", airdropVaultBalance_updated);
console2.log("airdropAsManagerSpendAllowance updated: ", airdropAsManagerSpendAllowance_updated);
console2.log("---------------------------2 Days---------------------------");
vm.warp(block.timestamp + oneDaysInSecond);
vm.startPrank(bob);
airdropContract_tst.claim();
vm.stopPrank();
vm.startPrank(alice);
airdropContract_tst.claim();
vm.stopPrank();
uint256 aliceLoveTokenBalanceNew = loveToken_tst.balanceOf(alice);
uint256 bobLoveTokenBalance = loveToken_tst.balanceOf(bob);
uint256 airdropVaultBalance_updatedNew = loveToken_tst.balanceOf(address(airdropVault_tst));
uint256 airdropAsManagerSpendAllowance_updatedNew =
loveToken_tst.allowance(address(airdropVault_tst), address(airdropContract_tst));
console2.log("aliceLoveTokenBalanceNew : ", aliceLoveTokenBalanceNew);
console2.log("bobLoveTokenBalance : ", bobLoveTokenBalance);
console2.log("airdropVaultBalance Updated : ", airdropVaultBalance_updatedNew);
console2.log("airdropAsManagerSpendAllowance updated: ", airdropAsManagerSpendAllowance_updatedNew);
console2.log("---------------------------After Million Years---------------------------");
console2.log("Approx 1.40 Billion Years!");
vm.warp((oneDaysInSecond * 499_999_997) + 1);
vm.startPrank(alice);
airdropContract_tst.claim();
vm.stopPrank();
uint256 aliceLoveTokenBalanceAfterMillionYears = loveToken_tst.balanceOf(alice);
uint256 bobLoveTokenBalanceAfterMillionYears = loveToken_tst.balanceOf(bob);
uint256 airdropVaultBalance_updatedAfterMillionYears = loveToken_tst.balanceOf(address(airdropVault_tst));
uint256 airdropAsManagerSpendAllowance_updatedAfterMillionYears =
loveToken_tst.allowance(address(airdropVault_tst), address(airdropContract_tst));
console2.log("Bob haven't Claim yet!");
console2.log("aliceLoveTokenBalanceAfterMillionYears : ", aliceLoveTokenBalanceAfterMillionYears);
console2.log("bobLoveTokenBalanceAfterMillionYears : ", bobLoveTokenBalanceAfterMillionYears);
console2.log(
"airdropVaultBalance Updated : ", airdropVaultBalance_updatedAfterMillionYears
);
console2.log(
"airdropAsManagerSpendAllowance updated : ",
airdropAsManagerSpendAllowance_updatedAfterMillionYears
);
console2.log("-------------Now Bob claims-----------");
vm.startPrank(bob);
airdropContract_tst.claim();
vm.stopPrank();
uint256 numDays = 499_999_997 - 2;
uint256 bobLoveTokenBalanceAfterMillionYearsClaimed = loveToken_tst.balanceOf(bob);
console2.log("Bob's expected claim : ", numDays * 10 ** 18);
console2.log(
"BobLoveTokenBalanceAfterMillionYears actual : ", bobLoveTokenBalanceAfterMillionYearsClaimed
);
console2.log("-------------------Now charlie and darci claims-------------------");
vm.startPrank(charlie);
airdropContract_tst.claim();
vm.stopPrank();
vm.startPrank(charlie);
airdropContract_tst.claim();
vm.stopPrank();
uint256 charlieLoveTokenBalanceAfterMillionYears = loveToken_tst.balanceOf(charlie);
uint256 darciLoveTokenBalanceAfterMillionYears = loveToken_tst.balanceOf(darci);
console2.log(
"charlieLoveTokenBalanceAfterMillionYears : ", charlieLoveTokenBalanceAfterMillionYears
);
console2.log("darciLoveTokenBalanceAfterMillionYears : ", darciLoveTokenBalanceAfterMillionYears);
}