Sparkn

CodeFox Inc.
DeFiFoundryProxy
15,000 USDC
View results
Submission Details
Severity: low
Valid

If a token is USDC and a winner is added to the USDC blacklist, the distribute() will revert

Summary

Distributor._distribute sends prizes to all contest winners, but if a winner is added to USDC blacklist, the call will revert.

Vulnerability Details

When a contest ends, prizes are distributed to all winners in a single call. If the contest token is USDC and any of the winners is added to USDC blacklist, the distribution will revert and thus none of the winners will receive a prize.

function _distribute(address token, address[] memory winners, uint256[] memory percentages, bytes memory data)
internal
{
// token address input check
if (token == address(0)) revert Distributor__NoZeroAddress();
if (!_isWhiteListed(token)) {
revert Distributor__InvalidTokenAddress();
}
// winners and percentages input check
if (winners.length == 0 || winners.length != percentages.length) revert Distributor__MismatchedArrays();
uint256 percentagesLength = percentages.length;
uint256 totalPercentage;
for (uint256 i; i < percentagesLength;) {
totalPercentage += percentages[i];
unchecked {
++i;
}
}
// check if totalPercentage is correct
if (totalPercentage != (10000 - COMMISSION_FEE)) {
revert Distributor__MismatchedPercentages();
}
IERC20 erc20 = IERC20(token);
uint256 totalAmount = erc20.balanceOf(address(this));
// if there is no token to distribute, then revert
if (totalAmount == 0) revert Distributor__NoTokenToDistribute();
uint256 winnersLength = winners.length; // cache length
for (uint256 i; i < winnersLength;) {
uint256 amount = totalAmount * percentages[i] / BASIS_POINTS;
erc20.safeTransfer(winners[i], amount);
unchecked {
++i;
}
}

Impact

A winner, blacklisted by the USDC token may prevent all winners to receive their prizes from a contest.

Tools Used

Manual review

Recommendations

Implement Pull over Push pattern so each winner can claim their reward individually.

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.