The PRNG used to calculate rarity is not strong enough.
rarity is calculated as such:
uint256 rarity = uint256(keccak256(abi.encodePacked(msg.sender, block.difficulty))) % 100;
msg.sender, and block.difficulty are all public information.
This is similar to my other submission on winnerIndex PRNG. But this uses a different PRNG as mentioned in the comments, so I put it as a separate submission.
On top of getting the raffle prize pool, an attacker can predict when the best time is to call the selecterWinner() and mint the rarest NFT, which he can sell for more profit on a secondary market.
Attacker can predict the next values for the PRNG and place himself so that he can mint the rarest NFT.
Manual Review.
Use Chainlink's PRNG which is unpredictable.
Root cause: bad RNG Impact: manipulate winner
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.