function _setFinallizedVaultBalance () internal returns (uint256) {
if (block.timestamp <= eventStartDate) {
revert eventNotStarted();
}
@> return finalizedVaultAsset = IERC20(asset()).balanceOf(address(this));
}
It will let people who has deposited the asset but not joined event loose their asset.
* @dev Test that finalizedVaultAsset incorrectly includes funds from non-participating users
* Scenario:
* - user1 deposits and joins the event
* - user2 deposits but does not join the event
* Expected:
* - finalizedVaultAsset should include only user1's stake
* Actual:
* - finalizedVaultAsset includes user2's funds (bug)
*/
function test_incorrect_finalizedVaultAsset() public {
vm.startPrank(user1);
mockToken.approve(address(briVault), 5 ether);
uint256 user1shares = briVault.deposit(5 ether, user1);
briVault.joinEvent(10);
console.log("user1 shares", user1shares);
vm.stopPrank();
vm.startPrank(user2);
mockToken.approve(address(briVault), 5 ether);
briVault.deposit(5 ether, user2);
vm.stopPrank();
vm.startPrank(owner);
briVault.setCountry(countries);
vm.warp(eventEndDate + 1);
briVault.setWinner(2);
vm.stopPrank();
uint256 correctFinalized = briVault.stakedAsset(user1);
uint256 actualFinalized = briVault.finalizedVaultAsset();
assertGt(actualFinalized, correctFinalized, "finalizedVaultAsset incorrectly includes non-participant assets");
}
function _setFinallizedVaultBalance () internal returns (uint256) {
if (block.timestamp <= eventStartDate) {
revert eventNotStarted();
}
- return finalizedVaultAsset = IERC20(asset()).balanceOf(address(this));
+ return finalizedVaultAsset = Math.mulDiv(IERC20(asset()).balanceOf(address(this)), totalParticipantShares, totalSupply());
}