Beatland Festival

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

Missing collection status management prevents activation of inactive memorabilia collections

Description:

The createMemorabiliaCollection() function allows organizers to set the initial isActive status through the activateNow parameter, which determines whether the collection can be redeemed immediately. However, the contract lacks any function to modify the isActive status after collection creation. This means collections created with activateNow = false become permanently unredeemable, as the redeemMemorabilia() function requires collection.isActive to be true. The missing status management functionality creates dead collections that can never be activated, regardless of organizer intentions or changing circumstances.

Attack path:

  1. Organizer creates a memorabilia collection with activateNow = false for planned future release

  2. Collection is successfully created and stored with isActive = false

  3. Users earn BEAT tokens through festival attendance expecting to redeem from this collection

  4. When organizer decides to release the collection, they discover no function exists to change isActive status

  5. Users attempt to redeem memorabilia using redeemMemorabilia(collectionId)

  6. Transaction reverts with "Collection not active" despite collection existing and having available supply

  7. Collection becomes permanently unredeemable with no recovery mechanism available

Impact:

Collection becomes permanently unredeemable with no recovery mechanism available

BEAT tokens earned for unredeemable collections become worthless for their intended purpose

Recommended Mitigation:

Add a function to allow organizers to toggle collection status after creation

function toggleCollectionStatus(uint256 collectionId, bool newStatus) external onlyOrganizer {
require(collections[collectionId].priceInBeat > 0, "Collection does not exist");
collections[collectionId].isActive = newStatus;
emit CollectionStatusChanged(collectionId, newStatus);
}
event CollectionStatusChanged(uint256 indexed collectionId, bool isActive);
Updates

Lead Judging Commences

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

createMemorabiliaCollection with isActive false for later usage - flow not properly implemented.

Low because an organizer can use it with active = true and organizer is trusted.

Support

FAQs

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