Summary
If winners.length
is long, gas griefing inside loop is possible.
Vulnerability Details
uint256 winnersLength = winners.length;
for (uint256 i; i < winnersLength;) {
uint256 amount = totalAmount * percentages[i] / BASIS_POINTS;
erc20.safeTransfer(winners[i], amount);
unchecked {
++i;
}
}
Impact
DoS of Prize distribution
Tools Used
Manual Review
Recommendations
Should have maximum limit for winner length.
uint256 winnersLength = winners.length;
+ require(winnersLength <= MAX_WINNERS_LENGTH, Distributor__WinnersLengthReched());
for (uint256 i; i < winnersLength;) {
uint256 amount = totalAmount * percentages[i] / BASIS_POINTS;
erc20.safeTransfer(winners[i], amount);
unchecked {
++i;
}
}