Normally, a deployment helper contract should perform deterministic, repeatable actions, deploying contracts with known, predictable addresses and ownership configuration.
In this case, the Helper contract instantiates a new DeploySnowmanAirdrop contract and calls its deploySnowmanAirdrop() function. If DeploySnowmanAirdrop deploys new contracts every time it's called and uses internal state or msg.sender during deployment, this pattern can lead to inconsistent deployments or incorrect ownership setup.
During Airdrop it is expected that Snow exist before we created Merkle Tree and deployed Airdrop and Snowmen contracts.
Likelihood:
Happens when the deployment script is run multiple times (e.g. during testing or multi-stage deployments)
Occurs whenever DeploySnowmanAirdrop uses internal state or msg.sender to configure ownership or other state-sensitive logic
Impact:
Deployed contract addresses will be inconsistent across runs, breaking integration tests, frontends, or deployment tracking
Ownership and permissions may be misconfigured if msg.sender is incorrectly set (e.g., set to Helper instead of an externally owned account)
If Snow relies on msg.sender for Ownable permissions, the deployer loses control:
Use inline or stateless deployment logic where possible to ensure clear ownership and deterministic behavior.
If using a deployer contract is necessary, ensure it:
Does not rely on internal state
Accepts all configuration (e.g. owner addresses) as parameters
Does not call functions sensitive to msg.sender
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.