The withdraw function uses .transfer() to send ETH, which will fail if the recipient is a contract without a receive() or fallback() function, potentially locking funds in the contract.
The contract uses .transfer() with a fixed 2300 gas stipend:
This will fail if:
The target is a contract without receive() or fallback() functions
The target contract's fallback function requires more than 2300 gas
The organizer address is set to a multisig or other contract wallet
Likelihood: Low - Only affects withdrawals to contract addresses that lack proper fallback functions or require more than 2300 gas.
Impact: Low - Funds aren't permanently locked as the owner can change the target address, but it breaks composability with modern smart contract infrastructure.
Withdrawals to contracts without receive() or fallback() functions will fail
Multisig wallets and smart contract wallets may be incompatible
Payment splitter contracts requiring more than 2300 gas won't work
Owner must use EOA addresses as workaround, reducing flexibility
This test demonstrates how the withdraw function fails when attempting to send ETH to contracts that cannot receive it:
Use .call() instead of .transfer() to support contract recipients:
This approach:
Provides unlimited gas for the recipient's fallback function
Supports all types of recipients (EOAs, multisigs, smart wallets)
Properly handles transfer failures
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.