attendPerformance(uint256 performanceId)
is meant to grant rewards once per pass-holder for each performance.
The safeguard is a mapping keyed only by the caller’s address:
Because a FestivalPass is an ERC-1155 token and therefore freely transferable:
Alice (wallet A) calls attendPerformance() → mapping set for A.
Alice transfers the very same pass to wallet B.
Wallet B calls attendPerformance() → mapping for B is empty → rewards minted again.
The cycle can be repeated with unlimited wallets (or even within the same block via flash-loans).
Unlimited BEAT (or perk) inflation: each physical pass can print rewards N times.
Bypasses time-based attendance limit: transferring the pass sidesteps the intended cooldown entirely.
Economic & reputational damage: honest attendees are diluted, leaderboards and reward programmes become unfair.
Likelihood:
Anyone can script pass transfers between their own wallets; no special privileges needed.
Impact:
Economic loss through unbounded BEAT issuance.
Reputational harm from reward-farming and ticket-scalping scenarios.
The PoC shows the same physical pass earning rewards twice by moving between two wallets, proving that the current address-centric check is insufficient.
Index attendance by passId
(or burn/lock the pass) so the token itself can be used only once per performance, regardless of how many times it changes hands.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.