Title: Atomicity Gap — Separate deposit() and joinEvent() Can Permanently Lock Funds
Impact: A user who deposits just before event start but fails to call joinEvent() becomes a partial participant: unable to use standard redeem (per F‑001 mitigation) and unable to withdraw via winner-only path — funds become irrecoverable.
Evidence: deposit() mints shares and records stakedAsset, while joinEvent() sets userToCountry; both are time‑gated and not atomic.
Recommendation (formal mitigation):
Merge deposit and joinEvent into a single atomic call (e.g., stakeAndChooseCountry) that performs transfer, fee deduction, share minting, and country registration in one transaction.
If maintaining separate functions, provide a safe recovery path: allow a limited-time manual claim or admin-assisted refund for deposits that were not followed by joinEvent() before eventStartDate (audit the threat of admin abuse if chosen).
Add tests covering edge timing scenarios and revert messages for clarity.
Illustrative API:
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.