Beatland Festival

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

No Event Emitted on Organizer Change

Root + Impact

Description

  • The setOrganizer function allows the contract owner to change the organizer address at any time. However, this critical action does not emit any event, making it invisible to off-chain monitoring, users, and auditors. This reduces transparency and makes it difficult to track when and how the most powerful role in the contract changes.

    Why This Matters

    • The organizer role controls all pass configuration, performance creation, and memorabilia management.

    • If the organizer is changed (maliciously or accidentally), users and dApps have no on-chain way to detect or respond to this change.

    • This can enable undetected privilege escalation, rug-pulls, or mismanagement, and makes audits and monitoring less effective.

// FestivalPass.sol
function setOrganizer(address _organizer) public onlyOwner {
@> organizer = _organizer;
}

Risk

Likelihood:

  • Every time the organizer is changed, there is no on-chain notification for users or monitoring systems.

  • This is a design omission and will always occur on every organizer change.

Impact:

  • Users, dApps, and auditors cannot detect organizer changes in real time.

  • Increases risk of undetected privilege escalation, rug-pulls, or mismanagement.

  • Reduces trust and auditability of the contract.

Proof of Concept

Any call to setOrganizer changes the organizer, but there is no on-chain event to notify off-chain systems or users.

function test_OrganizerChangeNoEvent() public {
// Owner changes organizer
address newOrganizer = address(0xBEEF);
vm.recordLogs();
festival.setOrganizer(newOrganizer);
Vm.Log[] memory entries = vm.getRecordedLogs();
// No event is emitted, so entries.length == 0
assertEq(entries.length, 0, "No event emitted on organizer change");
}

Recommended Mitigation

Emit an event every time the organizer is changed. This ensures all organizer changes are transparent and can be tracked by users, dApps, and auditors.

+ event OrganizerChanged(address indexed previousOrganizer, address indexed newOrganizer);
function setOrganizer(address _organizer) public onlyOwner {
+ emit OrganizerChanged(organizer, _organizer);
organizer = _organizer;
}
Updates

Lead Judging Commences

inallhonesty Lead Judge 3 months ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity
Assigned finding tags:

Missing events / Events not properly configured

Informational. This protocol doesn't rely on events to function, they are just nice to have, but not mandatory.

Support

FAQs

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