withdraw() can permanently lock fundsThe withdraw() function allows the owner to extract collected ETH from pass sales to a specified target address. This function is critical for festival revenue collection.
However, the function uses Solidity's transfer() method, which forwards only 2300 gas to the recipient. If the target address is a contract with a fallback function that requires more than 2300 gas, the transfer will fail and revert. This can permanently lock all ETH in the contract if the owner address is changed to a contract or if the intended withdrawal target requires more gas.
Likelihood: Medium
Occurs whenever target is a contract with non-trivial fallback/receive function
Common with multisig wallets, smart contract wallets, or contracts that log events
Owner might not realize target contract is incompatible until funds are already locked
Future contract upgrades or chain gas cost changes could break previously working targets
Impact: High
All collected ETH from pass sales becomes permanently locked in contract
No alternative withdrawal mechanism exists in the contract
Financial loss proportional to total pass sales revenue
Contract would require emergency upgrade or migration to recover funds
Alternative with pull pattern for additional safety:
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.