By calling refund() a player can steal all the ether in the contract
In refund() the value of a ticket is sent to the user before removing the player from the list. So in a receiver() or a fallback() on a malicious contract, an attacker can call this function again and again until all funds in the PuppyRaffle contract have been drawn
All contract ethers can be stolen
Manual review
Apply the Check-Effect-Interaction (CEI) pattern to refund()
Also apply the Oppenzepelin's nonReentrant modifier or a custom one
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.