Normally, selectWinner() should always be able to pay the prize and mint the puppy to the selected winner.
However, it pays with winner.call{value: prizePool} (and require(success)) and then calls _safeMint(winner, tokenId). If a contract enters the raffle and is selected as winner, but it rejects ETH (no receive/fallback) or does not implement onERC721Received, the call or _safeMint reverts, so the raffle round cannot be finalized for that selection.
Likelihood: Low
Requires a contract that cannot receive ETH or the ERC721 to be the randomly-selected winner (it can be deliberately entered to grief the round).
Impact: Medium
Prize distribution for that round is blocked / reverts, delaying or denying winner payout and puppy minting.
Use a pull-payment pattern (let the winner withdraw the prize) and _mint instead of _safeMint, or skip/re-roll a winner that cannot receive the prize/NFT.
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.