When transfer restrictions are enabled for an ArcToken using the whitelist module, minting and burning always revert. The restriction module requires both from and to addresses to be whitelisted when transfersAllowed == false. Because address(0) cannot be whitelisted, mints (from == address(0)) and burns (to == address(0)) are blocked. To mint or burn, the admin would have to temporarily set transfersAllowed = true, which enables transfers for everyone and defeats the purpose of the restriction regime.
Vulnerability Details
Resulting behavior under restriction:
Mint reverts: isTransferAllowed(address(0), recipient) is false because address(0) is not whitelisted.
Burn reverts: isTransferAllowed(holder, address(0)) is false because address(0) is not whitelisted.
PoC alignment:
test_MintReverts_WhenTransfersRestricted and test_BurnReverts_WhenTransfersRestricted in test/WhitelistMintBurnPoC.t.sol both pass:
After setTransfersAllowed(false), ArcToken.mint(...) and ArcToken.burn(...) revert with TransferRestricted.
Your trace logs confirm the reverts with the module returning false for zero-address endpoints.
Why toggling is not an option:
Admin could disable restrictions to perform mint/burn; however, setting transfersAllowed = true permits all transfers during the window, allowing unrestricted movement that violates the token’s intended compliance or freeze policy.
The whitelist module enforces that both endpoints must be whitelisted when restrictions are active:
Admin cannot mint or burn while restrictions are enforced, effectively locking operational control over supply.
Policy violation pressure:
To proceed with mint/burn, admin must open transfers, enabling everyone to move tokens during that period—contrary to the design intent of restricting transfers.
Production risk:
In regulated/whitelisted deployments, this either forces a permanent freeze of supply ops or creates unsafe windows of unrestricted movement.
References
See code snippets with github links in Vulnerability Details section above