Title: Duplicate and Unremoved Participants Increase Gas Cost and Iteration Complexity
Impact: usersAddress may contain duplicates and never shrinks when users cancel, increasing gas cost for finalization loops and making on‑chain iteration unreliable.
Evidence: joinEvent appends without checking hasJoined; cancelParticipation does not remove entries.
Recommendation (formal mitigation):
Maintain a mapping(address => bool) hasJoined to prevent duplicate appends.
Implement participant removal using swap-and-pop in cancelParticipation and clear hasJoined flag.
Consider bounded data structures or off‑chain aggregation for large participant sets; if iteration on-chain is unavoidable, document participant limits and gas implications.
Example removal pattern:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.