betterERC
Docs/Integrating

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.

Screen.sol
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.

FlowPausedSender frozenRecipient frozen
transfer (both non-zero)rejectedrejectedrejected
mint (from is zero)allowedn/arejected
burn (to is zero)allowedallowedn/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.