Beatland Festival

First Flight #44
Beginner FriendlyFoundrySolidityNFT
100 EXP
View results
Submission Details
Severity: low
Valid

`FestivalPass::uri` does not check for `tokenId == 0`

No check in FestivalPass::uri for tokenId == 0

Description

It does not effect the protocol that much but it is a good practice to add zero checks. In FestivalPass::uri if we give 0 as tokenId's value then it will give wrong uri, which is not a good coding practice.

function uri(uint256 tokenId) public view override returns (string memory) {
// Handle regular passes (IDs 1-3)
@> if (tokenId <= BACKSTAGE_PASS) {
return string(abi.encodePacked("ipfs://beatdrop/", Strings.toString(tokenId)));
}
// Decode collection and item IDs
(uint256 collectionId, uint256 itemId) = decodeTokenId(tokenId);
// Check if it's a valid memorabilia token
if (collections[collectionId].priceInBeat > 0) {
// Return specific URI for this item
// e.g., "ipfs://QmXXX/metadata/5" for item #5
return string(abi.encodePacked(
collections[collectionId].baseUri,
"/metadata/",
Strings.toString(itemId)
));
}
return super.uri(tokenId);
}

Risk: No risk at all but it is a good practice to add zero checks

Proof of Concept

function test_Uri_Pass() public view {
// Regular passes should use default URI
assertEq(festivalPass.uri(0), "ipfs://beatdrop/0");//this is the main test
//assertEq(festivalPass.uri(2), "ipfs://beatdrop/2");
// assertEq(festivalPass.uri(3), "ipfs://beatdrop/3");
}

Recommended Mitigation

function uri(uint256 tokenId) public view override returns (string memory) {
// Handle regular passes (IDs 1-3)
+ require(tokenId >0, "tokenId cannot be zero");
@> if (tokenId <= BACKSTAGE_PASS) {
return string(abi.encodePacked("ipfs://beatdrop/", Strings.toString(tokenId)));
}
// Decode collection and item IDs
(uint256 collectionId, uint256 itemId) = decodeTokenId(tokenId);
// Check if it's a valid memorabilia token
if (collections[collectionId].priceInBeat > 0) {
// Return specific URI for this item
// e.g., "ipfs://QmXXX/metadata/5" for item #5
return string(abi.encodePacked(
collections[collectionId].baseUri,
"/metadata/",
Strings.toString(itemId)
));
}
return super.uri(tokenId);
}
Updates

Lead Judging Commences

inallhonesty Lead Judge about 1 month ago
Submission Judgement Published
Validated
Assigned finding tags:

uri for non-existing ids

Support

FAQs

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