Pause and blocklist
ERC-1404 codes, the matrix of what each lever actually stops, and why a frozen counterparty is a liquidation signal.
All docs
The token implements ERC-1404, so existing compliance tooling works unchanged. Screen before submitting rather than catching the revert.
uint8 code = IERC20TransferRestriction(token)
.detectTransferRestriction(from, to, amount);
if (code != 0) {
// Do not attempt the transfer. Render the reason:
string memory why = IERC20TransferRestriction(token)
.messageForTransferRestriction(code);
}Codes are per-token. This framework's reference module uses zero for allowed, one for paused, two for sender frozen and three for recipient frozen — but render the message rather than hard-coding anything except zero. Another assembly may define more.
What each lever actually stops
Restrictions apply to transfers, not to supply changes.
| Flow | Paused | Sender frozen | Recipient frozen |
|---|---|---|---|
| transfer (both non-zero) | rejected | rejected | rejected |
| mint (from is zero) | allowed | n/a | rejected |
| burn (to is zero) | allowed | allowed | n/a |
Both asymmetries are deliberate. A pause that also froze supply would strip the authority of its ability to fix whatever caused the pause — the token would be bricked at the moment it most needs intervention. And a burn that a freeze blocked would force the issuer to unfreeze before settling a balance, reopening exactly the window the freeze exists to close.
What this means for you
A frozen counterparty's balance can be burned out from under a position you hold against it. If you lend against this token, treat a frozen borrower as a liquidation-relevant signal rather than only a transfer-time check. By the time a transfer fails, the collateral may already be gone.
Both levers come from one module, so a token declaring either declares both. There is no configuration in which pausing is available and freezing is not.