The refund function does not follow the pattern of checks, effects, interactions, Instead it sends the refund before making state changes. Also, the OpenZeppelin docs specifically note that you are handing control over to msg.sender when you use their sendValue function. This is an unsafe external call that would allow an attacker to drain the contract.
Someone could write a contract that would repeatedly call into refund and drain the contract of an amount equal to the number of calls times the entrance fee.
Manual review
Move "payable(msg.sender).sendValue(entranceFee)" to the end of the the refund function, after the state changes.
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.