Beatland Festival

First Flight #44
Beginner FriendlyFoundrySolidityNFT
100 EXP
View results
Submission Details
Impact: low
Likelihood: medium
Invalid

Memorabilia redemption bypasses attendance verification allowing non-attendees to obtain proof-of-attendance NFTs

Description:

The redeemMemorabilia function in the FestivalPass contract fails to verify that users actually attended the festival before allowing them to redeem memorabilia NFTs. The function only checks if the user has sufficient BEAT tokens and if the collection is active, but does not validate festival pass ownership or performance attendance. Since BEAT tokens are standard ERC20 tokens that can be freely transferred, users who never attended the festival can acquire BEAT tokens through secondary markets or transfers and redeem memorabilia intended as proof-of-attendance collectibles.

Attack path:

  1. Real festival attendee purchases a pass using buyPass() and earns BEAT tokens by attending performances via attendPerformance()

  2. Attacker acquires BEAT tokens through:

    • Direct transfer from the attendee using standard ERC20 transfer()

    • Purchase on secondary markets/DEXes

  3. Attacker calls redeemMemorabilia(collectionId) with sufficient BEAT token balance

  4. Contract burns attacker's BEAT tokens and mints unique memorabilia NFT without verifying festival attendance

  5. Attacker now owns "proof-of-attendance" NFT despite never attending the festival

Impact:

  • NFTs lose their value as genuine proof-of-attendance collectibles

  • Non-attendees can acquire festival memorabilia without contributing to the festival economy through pass purchases

Recommended Mitigation:

Add attendance verification to the redeemMemorabilia function:

function redeemMemorabilia(uint256 collectionId) external {
require(hasPass(msg.sender), "Must own a festival pass");
require(getUserAttendanceCount(msg.sender) > 0, "Must have attended at least one performance");
MemorabiliaCollection storage collection = collections[collectionId];
// ... rest of existing logic
}

Alternatively, implement a soul-bound or non-transferable BEAT token mechanism specifically for memorabilia redemption to ensure only earned tokens can be used.

Updates

Lead Judging Commences

inallhonesty Lead Judge about 1 month ago
Submission Judgement Published
Invalidated
Reason: Design choice

Support

FAQs

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