Root Cause: selectWinner() uses _safeMint() which requires contract recipients to implement onERC721Received(), but this isn't validated during raffle entry.
Impact: If a smart contract wallet without ERC721Receiver interface wins, the entire selectWinner() transaction reverts, blocking raffle completion and locking all funds.
Normal Behavior: When a winner is selected, they should receive both the ETH prize and the NFT.
Issue: The _safeMint() function requires contract recipients to implement onERC721Received(). If a smart contract wallet or multisig wins and doesn't implement this interface, the entire selectWinner() transaction reverts, blocking the raffle.
Likelihood:MEDIUM
Reason 1 : Many users operate through smart contract wallets (Gnosis Safe, Argent, etc.)
Reason 2 : Some older multisig wallets don't implement ERC721Receiver
Impact:
Impact 1: Raffle becomes permanently stuck if such a wallet wins
Impact 2: No winner can be selected until that wallet is removed
ERC-721's _safeMint() function was designed to prevent NFTs from being sent to contracts that can't handle them (which would lock the NFT forever). It does this by calling onERC721Received() on the recipient.
selectWinner() determines the winner but doesn't transfer the NFT
Winner calls claimPrize() to receive their 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.