Beginner FriendlyFoundryNFT
100 EXP
View results
Submission Details
Severity: low
Valid

Participants are mislead by the rarity chances.

Summary

The drop chances defined in the state variables section for the COMMON and LEGENDARY are misleading.

Vulnerability Details

The 3 rarity scores are defined as follows:

uint256 public constant COMMON_RARITY = 70;
uint256 public constant RARE_RARITY = 25;
uint256 public constant LEGENDARY_RARITY = 5;

This implies that out of a really big number of NFT's, 70% should be of common rarity, 25% should be of rare rarity and the last 5% should be legendary. The selectWinners function doesn't implement these numbers.

uint256 rarity = uint256(keccak256(abi.encodePacked(msg.sender, block.difficulty))) % 100;
if (rarity <= COMMON_RARITY) {
tokenIdToRarity[tokenId] = COMMON_RARITY;
} else if (rarity <= COMMON_RARITY + RARE_RARITY) {
tokenIdToRarity[tokenId] = RARE_RARITY;
} else {
tokenIdToRarity[tokenId] = LEGENDARY_RARITY;
}

The rarity variable in the code above has a possible range of values within [0;99] (inclusive)
This means that rarity <= COMMON_RARITY condition will apply for the interval [0:70], the rarity <= COMMON_RARITY + RARE_RARITY condition will apply for the [71:95] rarity and the rest of the interval [96:99] will be of LEGENDARY_RARITY

The [0:70] interval contains 71 numbers (70 - 0 + 1)

The [71:95] interval contains 25 numbers (95 - 71 + 1)

The [96:99] interval contains 4 numbers (99 - 96 + 1)

This means there is a 71% chance someone draws a COMMON NFT, 25% for a RARE NFT and 4% for a LEGENDARY NFT.

Impact

Depending on the info presented, the raffle participants might be lied with respect to the chances they have to draw a legendary NFT.

Tools Used

Manual review

Recommendations

Drop the = sign from both conditions:

-- if (rarity <= COMMON_RARITY) {
++ if (rarity < COMMON_RARITY) {
tokenIdToRarity[tokenId] = COMMON_RARITY;
-- } else if (rarity <= COMMON_RARITY + RARE_RARITY) {
++ } else if (rarity < COMMON_RARITY + RARE_RARITY) {
tokenIdToRarity[tokenId] = RARE_RARITY;
} else {
tokenIdToRarity[tokenId] = LEGENDARY_RARITY;
}
Updates

Lead Judging Commences

Hamiltonite Lead Judge about 2 years ago
Submission Judgement Published
Validated
Assigned finding tags:

wrong nft rarity

71% 25% 4%

Support

FAQs

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

Give us feedback!