function joinEvent(uint256 countryId) public {
if (stakedAsset[msg.sender] == 0) {
revert noDeposit();
}
if (countryId >= teams.length) {
revert invalidCountry();
}
if (block.timestamp > eventStartDate) {
revert eventStarted();
}
userToCountry[msg.sender] = teams[countryId];
uint256 participantShares = balanceOf(msg.sender);
userSharesToCountry[msg.sender][countryId] = participantShares;
usersAddress.push(msg.sender);
numberOfParticipants++;
totalParticipantShares += participantShares;
emit joinedEvent(msg.sender, countryId);
}
function test_singleUserCanJoinMultipleTeamsAndWithdraw2() public {
vm.prank(owner);
briVault.setCountry(countries);
vm.startPrank(user6);
mockToken.mint(user6, 1 ether);
mockToken.approve(address(briVault), 1 ether);
briVault.deposit(1 ether, user6);
uint256 user6InitialShares = briVault.balanceOf(user6);
console.log("user6 initial shares:", user6InitialShares);
uint256 totalSharesBeforeJoining = briVault.totalParticipantShares();
uint256 briVaultBalance = mockToken.balanceOf(address(briVault));
console.log("briVault balance before joining:", briVaultBalance);
console.log("total participant shares before joining:", totalSharesBeforeJoining);
briVault.joinEvent(0);
briVault.joinEvent(0);
uint256 totalSharesAfterJoin = briVault.totalParticipantShares();
console.log("total participant shares after join:", totalSharesAfterJoin);
uint256 totalParticipants = briVault.numberOfParticipants();
uint256 totalSharesAfterAllJoins = briVault.totalParticipantShares();
console.log("number of participants:", totalParticipants);
console.log("total participant shares:", totalSharesAfterAllJoins);
vm.stopPrank();
vm.warp(eventEndDate + 1);
vm.prank(owner);
briVault.setWinner(0);
vm.prank(user6);
briVault.withdraw();
uint256 user6FinalBalance = mockToken.balanceOf(user6);
uint256 user6FinalShares = briVault.balanceOf(user6);
console.log("user6 final shares after withdraw:", user6FinalShares);
uint256 vaultFinalBalance = briVault.finalizedVaultAsset();
console.log("\n=== Final balances ===");
console.log("user6 final token balance:", user6FinalBalance);
console.log("vault final balance:", vaultFinalBalance);
assert(user6FinalBalance < briVaultBalance);
}
+ mapping(address => bool) userJoined;
+ error userAlreadyJoin();
///
function joinEvent(uint256 countryId) public {
if (stakedAsset[msg.sender] == 0) {
revert noDeposit();
}
+ if (userJoined(msg.sender) = true) {
+ revert userAlreadyJoin();
+ } else {
+ userJoined(msg.sender) = true;
+ }
// Ensure countryId is a valid index in the `teams` array
if (countryId >= teams.length) {
revert invalidCountry();
}
if (block.timestamp > eventStartDate) {
revert eventStarted();
}
userToCountry[msg.sender] = teams[countryId];
uint256 participantShares = balanceOf(msg.sender);
userSharesToCountry[msg.sender][countryId] = participantShares;
usersAddress.push(msg.sender);
numberOfParticipants++;
totalParticipantShares += participantShares;
emit joinedEvent(msg.sender, countryId);
}