The constructor stores _organizer and _beatToken without any zero-address or wiring validation. organizer == address(0) bricks every organizer-only function (pass config, performances, collections), and a wrong/zero beatToken makes all VIP/BACKSTAGE bonuses, attendance rewards, and memorabilia redemptions revert — with no setter to correct the token address afterwards. A single deployment mistake is unrecoverable.
organizer can later be fixed by setOrganizer (onlyOwner), so the zero-organizer case is recoverable by the owner. However beatToken is written only here and has no setter (grep beatToken shows the constructor is the sole write). If _beatToken is zero or not the deployed BeatToken, calls at FestivalPass.sol:82, :115, and :197 revert, and the token binding cannot be repaired. Combined with BeatToken's one-shot setFestivalContract (see I-1), a mismatched pair is permanent.
Likelihood: Low. Requires a deploy-script error or a wrong argument; not reachable by an external attacker.
Impact: Deployment-time denial of service for rewards and redemptions (and organizer functions if organizer is zero until fixed). Recoverable for organizer; unrecoverable for beatToken. No external funds are at risk, but a misconfigured launch is non-functional.
Deploying with _organizer = address(0) and then attempting to configure a pass reverts with "Only organizer can call this", showing the zero-organizer start state is unusable without an owner intervention.
Validate both addresses at construction and add a guarded setter for the BEAT token (or require the reciprocal binding to be established atomically) so a mistake is recoverable. At minimum reject the zero address.
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.