A user can drain the contract using a malicious contract that reenter refund function.
A malicious contract can re-enter refund function here:
CEI pattern is not followed because players[playerIndex] = address(0) is executed after the external call.
All ETH in the contract can be drained.
Manual review
Follow CEI pattern:
In addition use nonReentrant() modifier by OpenZeppelin ReentrancyGuard contract.
reentrancy in refund() function
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.