The ERC20 standard specifies that transfer() should return a boolean value indicating success or failure. While most tokens revert on failure, some non-standard tokens (like USDT) return false instead of reverting.
The withdrawTokens() function calls IERC20(token).transfer() without checking the return value. If the transfer fails silently (returns false), the function will continue execution and emit the TokensWithdrawn event, incorrectly indicating success.
Likelihood:
Tokens like USDT on mainnet return false on failure instead of reverting
The issue only manifests when the hook has insufficient token balance or when dealing with non-standard ERC20 tokens
Owner might not notice failed withdrawals if they only check events
Impact:
Silent failures where tokens are not actually transferred
Events incorrectly indicate successful withdrawal
Owner believes funds were withdrawn when they weren't
Loss of trust in protocol accounting
Difficulty debugging when withdrawals don't appear in destination wallet
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.