No additional users can enter the raffle if at least 2 participants get refunded because of duplicate checks.
PuppyRaffle::refund() changes the user address to address(0).
If two or more users call PuppyRaffle::refund() this will cause multiple address(0) entries in PuppyRaffle::players array and all subsequent PuppyRaffle:enterRaffle function calls will to fail due to the duplicate check.
When there are two or more inactive participants, no further entries can be made into the raffle.
If, in addition to this, there are two inactive participants and the total number of participants is less than four it becomes impossible to select a winner.
Moreover, if there is a balance in the contract, withdrawing fees is also impossible.
As a result, the PuppyRaffle::enterRaffle and PuppyRaffle::selectWinner functions are rendered non-functional.
Foundry
Recommendation one:
fix the implementation of the PuppyRaffle::_isActivePlayer function and use it when doing duplicate player checks.
See the reported vulnerability titled: "Unused and bad implementation of PuppyRaffle::_isActivePlayer function" for details of PuppyRaffle::_isActivePlayer function implementation.
Recommendation two (better option): instead of storing participants in an array store them in mapping where player address can be marked as active or inactive mapping(address => bool) public players;. This will also save gas when checking for duplicates.
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.