function test_withdrawAfterStaking() 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));
Staking stakingContract_tst = new Staking(
ILoveToken(address(loveToken_tst)),
ISoulmate(address(soulmateContract_tst)),
IVault(address(stakingVault_tst))
);
stakingVault_tst.initVault(ILoveToken(address(loveToken_tst)), address(stakingContract_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));
uint256 stakingVaultBalance = loveToken_tst.balanceOf(address(stakingVault_tst));
uint256 stakingAsManagerSpendAllowance =
loveToken_tst.allowance(address(stakingVault_tst), address(stakingContract_tst));
console2.log("total supply : ", totalSupply_one);
console2.log("airdropVaultBalance : ", airdropVaultBalance);
console2.log("airdropAsManagerSpendAllowance : ", airdropAsManagerSpendAllowance);
console2.log("stakingVaultBalance : ", stakingVaultBalance);
console2.log("stakingAsManagerSpendAllowance : ", stakingAsManagerSpendAllowance);
console2.log("------------------------------------------------------------------------------");
address alice = makeAddr("ALICE");
address bob = makeAddr("BOB");
vm.startPrank(alice);
soulmateContract_tst.mintSoulmateToken();
vm.warp(1 days + 1);
airdropContract_tst.claim();
vm.stopPrank();
uint256 aliceLoveTokenBalanceBeforeStaking = loveToken_tst.balanceOf(alice);
vm.startPrank(alice);
loveToken_tst.approve(address(stakingContract_tst), aliceLoveTokenBalanceBeforeStaking);
uint256 stakingContractBalanceBD = loveToken_tst.balanceOf(address(stakingContract_tst));
uint256 stakingAsStakeProviderSpendAllowanceFromAliceBD =
loveToken_tst.allowance(alice, address(stakingContract_tst));
stakingContract_tst.deposit(aliceLoveTokenBalanceBeforeStaking);
vm.stopPrank();
uint256 aliceStakedLoveTokenBalance = stakingContract_tst.userStakes(alice);
uint256 aliceLoveTokenBalanceAfterStaking = loveToken_tst.balanceOf(alice);
uint256 totalSupplyUpdated = loveToken_tst.totalSupply();
uint256 airdropVaultBalanceUpdated = loveToken_tst.balanceOf(address(airdropVault_tst));
uint256 airdropAsManagerSpendAllowanceUpdated =
loveToken_tst.allowance(address(airdropVault_tst), address(airdropContract_tst));
uint256 stakingVaultBalanceUpdated = loveToken_tst.balanceOf(address(stakingVault_tst));
uint256 stakingAsManagerSpendAllowanceUpdated =
loveToken_tst.allowance(address(stakingVault_tst), address(stakingContract_tst));
uint256 stakingAsStakeProviderSpendAllowanceFromAliceAD =
loveToken_tst.allowance(alice, address(stakingContract_tst));
uint256 stakingContractBalanceAD = loveToken_tst.balanceOf(address(stakingContract_tst));
console2.log("total supply : ", totalSupplyUpdated);
console2.log("airdropVaultBalanceUpdated : ", airdropVaultBalanceUpdated);
console2.log("airdropAsManagerSpendAllowanceUpdated : ", airdropAsManagerSpendAllowanceUpdated);
console2.log("stakingVaultBalanceUpdated : ", stakingVaultBalanceUpdated);
console2.log("stakingAsManagerSpendAllowanceUpdated : ", stakingAsManagerSpendAllowanceUpdated);
console2.log("aliceLoveTokenBalanceBeforeStaking : ", aliceLoveTokenBalanceBeforeStaking);
console2.log("aliceStakedLoveTokenBalance : ", aliceStakedLoveTokenBalance);
console2.log("aliceLoveTokenBalanceAfterStaking : ", aliceLoveTokenBalanceAfterStaking);
console2.log("stakingContractBalanceBD : ", stakingContractBalanceBD);
console2.log("stakingContractBalanceAD : ", stakingContractBalanceAD);
console2.log(
"stakingAsStakeProviderSpendAllowanceFromAliceBD: ", stakingAsStakeProviderSpendAllowanceFromAliceBD
);
console2.log(
"stakingAsStakeProviderSpendAllowanceFromAliceAD: ", stakingAsStakeProviderSpendAllowanceFromAliceAD
);
console2.log("------------------------------------------------------------------------------");
vm.warp(block.timestamp + 2 weeks);
vm.startPrank(alice);
stakingContract_tst.claimRewards();
stakingContract_tst.withdraw(1e18);
vm.stopPrank();
uint256 totalSupplyUpdatedNew = loveToken_tst.totalSupply();
uint256 airdropVaultBalanceUpdatedNew = loveToken_tst.balanceOf(address(airdropVault_tst));
uint256 airdropAsManagerSpendAllowanceUpdatedNew =
loveToken_tst.allowance(address(airdropVault_tst), address(airdropContract_tst));
uint256 stakingVaultBalanceUpdatedAS = loveToken_tst.balanceOf(address(stakingVault_tst));
uint256 stakingAsManagerSpendAllowanceUpdatedAS =
loveToken_tst.allowance(address(stakingVault_tst), address(stakingContract_tst));
uint256 aliceBalanceAfterStakingClaim = loveToken_tst.balanceOf(alice);
uint256 stakingContractBalanceNew = loveToken_tst.balanceOf(address(stakingContract_tst));
console2.log("total supply : ", totalSupplyUpdatedNew);
console2.log("airdropVaultBalanceUpdatedNew : ", airdropVaultBalanceUpdatedNew);
console2.log("airdropAsManagerSpendAllowanceUpdatedNew : ", airdropAsManagerSpendAllowanceUpdatedNew);
console2.log("stakingVaultBalanceUpdatedAS : ", stakingVaultBalanceUpdatedAS);
console2.log("stakingAsManagerSpendAllowanceUpdatedAS : ", stakingAsManagerSpendAllowanceUpdatedAS);
console2.log("stakingContractBalanceNew : ", stakingContractBalanceNew);
console2.log("aliceBalanceAfterStakingClaim : ", aliceBalanceAfterStakingClaim);
}