function getUsersAddress() external view returns (address[] memory) {
return usersAddress;
}
function test_users_can_join_multiple_times() public {
uint256 depositAmount = 0.1 ether;
vm.startPrank(user1);
mockToken.approve(address(briVault), depositAmount);
briVault.deposit(depositAmount, user1);
briVault.joinEvent(0);
vm.startPrank(user2);
mockToken.approve(address(briVault), depositAmount);
briVault.deposit(depositAmount, user2);
briVault.joinEvent(1);
vm.startPrank(user3);
mockToken.approve(address(briVault), depositAmount);
briVault.deposit(depositAmount, user3);
briVault.joinEvent(2);
vm.startPrank(user2);
mockToken.approve(address(briVault), depositAmount);
briVault.deposit(depositAmount, user2);
briVault.joinEvent(1);
address[] memory users = briVault.getUsersAddress();
bool hasDuplicateUser = false;
for (uint256 i = 0; i < users.length; i++) {
for (uint256 j = i + 1; j < users.length; j++) {
if (users[i] == users[j]) {
hasDuplicateUser = true;
}
}
}
assertEq(hasDuplicateUser, true);
}
+error userAlreadyJoined();
+mapping(address => bool) public hasJoined;
function joinEvent(uint256 countryId) public {
+ require(!hasJoined[msg.sender], userAlreadyJoined());
if (stakedAsset[msg.sender] == 0) {
revert noDeposit();
}
// 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;
+ hasJoined[msg.sender] = true;
usersAddress.push(msg.sender);
numberOfParticipants++;
totalParticipantShares += participantShares;
emit joinedEvent(msg.sender, countryId);
}