The owner calls claimFees to withdraw ETH collected from claim fees. The implementation forwards the entire contract ETH balance to owner() via a low-level call with empty calldata.
When owner() is a contract without a payable receive/fallback, or a contract that deliberately reverts on receive, claimFees always reverts and fees remain stuck. The tagged @audit-info concern about gas: .call forwards most remaining gas to the callee (EIP-150 63/64 rule), increasing griefing surface for malicious owner implementations.
Likelihood:
The deployer sets Ownable owner to a multisig or module contract on zkSync Era without a payable receive path.
Claims occur repeatedly, accumulating FEE per claim in the contract balance.
Impact:
All ETH fees are permanently unwithdrawable until ownership is transferred to an EOA that can accept ETH.
Owner contract callbacks can consume excessive gas on each withdrawal attempt (operational DoS on fee collection).
Set i_feeRecipient to a known EOA at construction, or document that owner must accept plain ETH transfers.
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.