Normal behavior
In a standard ERC20 token, minting and burning must emit Transfer events:
Mint:
totalSupply increases.
balance[account] increases.
Event: Transfer(address(0), account, value).
Burn:
totalSupply decreases.
balance[account] decreases.
Event: Transfer(account, address(0), value)
Many tools (explorers, indexers, DeFi dashboards) reconstruct balances and supply purely by streaming Transfer events, assuming that:
Every balance change is reflected in a Transfer.
Mints and burns are encoded as transfers from/to the zero address.
Issue
This implementation correctly updates _totalSupply and balances in _mint and _burn, but it never emits the Transfer events that represent those changes. As a result:
Minted tokens appear in balances and totalSupply() but no corresponding Transfer(0, account, value) log exists.
Burned tokens disappear from balances and totalSupply() but no Transfer(account, 0, value) log exists.
This silently breaks event-based accounting and any contract or off-chain system that relies on Transfer logs to track token flows.
Likelihood:
Whenever a privileged minter (or any derived contract) calls mint(account, value), totalSupply and balanceOf(account) change without any Transfer(address(0), account, value) event being emitted.
Whenever a burner function calls burn(account, value), totalSupply and balanceOf(account) change without any Transfer(account, address(0), value) event being emitted.
Impact:
Indexers, explorers, and accounting tools that reconstruct balances and supply from Transfer events will show incorrect data: minted tokens may appear “out of nowhere” or not at all, and burned tokens may still appear as circulating.
DeFi protocols that rely on event-based audits will be unable to track or validate supply changes, increasing the risk of undetected inflation or mis-accounting.
These tests show that calls to mint and burn do not emit the expected Transfer events. You can paste them into Token.t.sol.
Emit standard Transfer events in _mint and _burn using the same topic and layout as _transfer. The Transfer topic used in _transfer is already correct:
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.
The contest is complete and the rewards are being distributed.