Events are declared to signal meaningful state changes to off-chain listeners. A MerkleRootUpdated event implies the merkle root can be changed after deployment — an important feature for long-running airdrop contracts.
i_merkleRoot is declared immutable and assigned only in the constructor. There is no setMerkleRoot or equivalent function. The MerkleRootUpdated event is declared but never emitted anywhere in the contract and cannot ever be emitted because the state it describes — a root update — is architecturally impossible.
Likelihood:
This is present in every deployment of the contract as written — it is structural dead code
Impact:
Off-chain indexers, subgraphs, or front-ends that listen for MerkleRootUpdated events will never receive one, potentially causing silent integration failures or incorrect "no updates" assumptions
The event's presence falsely implies that the root can be updated — auditors and integrators must spend time confirming that no update path exists, adding unnecessary audit surface
Dead code increases bytecode size marginally and reduces overall code clarity
Either remove the dead event declaration, or implement the update functionality it implies (with appropriate access control):
Option A — remove the dead event:
Option B — implement the feature the event implies (if updatability is desired):
Option A is recommended for this codebase since the airdrop is designed to be a one-shot deployment.
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.