Scope: src/PuppyRaffle.sol
The selectWinner() function calculates totalAmountCollected based on players.length, not actual contract balance. When players refund, their ETH leaves the contract, but they're still counted in the calculation, leading to failed transfers.
Normal behavior: The prize pool should be calculated based on actual funds available in the contract.
The issue: players.length includes refunded players (now address(0)), but their ETH has already been refunded. This causes prizePool to exceed available balance, making the transfer fail.
Likelihood:
Occurs whenever any player refunds before winner selection
Refund functionality is a core feature of the protocol
Users are explicitly encouraged to refund per documentation
Impact:
selectWinner() reverts, blocking raffle completion
All players' funds stuck in contract
Protocol functionality completely broken
Explanation: The test enters 4 players (4 ETH), then 2 refund (leaving 2 ETH). When selectWinner() runs, it calculates prizePool as 3.2 ETH (4 players × 1 ETH × 80%), but only 2 ETH exists. The transfer fails because there's insufficient balance.
Explanation: Track active players separately and calculate prize pool based on actual balance minus accumulated fees.
## Description In the `selectWinner` function, when a player has refunded and their address is replaced with address(0), the prize money may be sent to address(0), resulting in fund loss. ## Vulnerability Details In the `refund` function if a user wants to refund his money then he will be given his money back and his address in the array will be replaced with `address(0)`. So lets say `Alice` entered in the raffle and later decided to refund her money then her address in the `player` array will be replaced with `address(0)`. And lets consider that her index in the array is `7th` so currently there is `address(0)` at `7th index`, so when `selectWinner` function will be called there isn't any kind of check that this 7th index can't be the winner so if this `7th` index will be declared as winner then all the prize will be sent to him which will actually lost as it will be sent to `address(0)` ## Impact Loss of funds if they are sent to address(0), posing a financial risk. ## Recommendations Implement additional checks in the `selectWinner` function to ensure that prize money is not sent to `address(0)`
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.