Normal behavior: burnFaucetTokens should destroy tokens that the faucet contract holds, reducing the contract's token balance and the total supply by the requested amount. The function name and behavior must match: a "burn" operation should not act as a withdraw to the owner.
Specific issue: the current implementation transfers the contract's entire token balance to the owner and then calls _burn on the owner for only amountToBurn. As implemented, the owner receives nearly all of the contract tokens while only amountToBurn is actually removed from total supply. This effectively converts a burn function into a privileged withdrawal allowing the owner to siphon the faucet balance.
Likelihood:High
Owner calls burnFaucetTokens while the contract holds any positive token balance — this code path always performs the transfer-to-owner step before burning and therefore will execute the problematic transfer during normal owner operation.
Teams deploy or use the contract under the expectation that burnFaucetTokens destroys contract-held tokens — this assumption causes the function to be called in production environments where the unintended transfer will occur during normal maintenance or audits.
Impact:High
Direct asset exfiltration: the owner can obtain nearly the entire faucet token balance (contract balance minus the small burned amount), causing immediate financial loss and destruction of trust.
Monitoring and accounting blindspots: automated monitors or auditors that only check totalSupply changes will observe the burned amount but may miss that the larger transfer moved tokens to the owner, complicating incident detection and response.
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.