Transfer event is emitted twice for minting or burning USDz
Description
The USDz contract has internal helper functions for minting and burning USDz tokens, _mintUSDz
and _burnUSDz
:
function _mintUSDz(address _receiver, uint256 _amount) internal {
_mint(_receiver, _amount);
totalPooledSPCT = totalPooledSPCT.add(_amount);
emit Mint(msg.sender, _amount);
emit Transfer(address(0), _receiver, _amount);
}
function _burnUSDz(address _account, uint256 _amount) internal {
_burn(_account, _amount);
totalPooledSPCT = totalPooledSPCT.sub(_amount);
emit Burn(msg.sender, _amount);
emit Transfer(_account, address(0), _amount);
}
These functions call the _mint
or _burn
functions in the OpenZeppelin ERC20 implementation, record the pooled amount of SPCT tokens, and emit the events Burn
and Transfer
.
However, the _mint
and _burn
functions also emit the Transfer
event via calls to the _update
function:
function _mint(address account, uint256 value) internal {
// ...
_update(address(0), account, value);
}
function _burn(address account, uint256 value) internal {
// ...
_update(account, address(0), value);
}
function _update(address from, address to, uint256 value) internal virtual {
// ...
emit Transfer(from, to, value);
}
As a result, the identical Transfer
event would be emitted twice when USDz tokens are minted or burnt.
Impact
Although this issue will not affect the business logic of this contract, it is possible that an off-chain infrastructure depending on this event fails to properly track the minting and burning of USDz tokens.
Recommendations
Consider removing the code that emits the Transfer
event, as it is already being emitted.
Remediation
This issue has been acknowledged by Anzen Group Ltd., and a fix was implemented in commit 66273edb↗.