> ## Documentation Index
> Fetch the complete documentation index at: https://docs.layerzero.network/llms.txt
> Use this file to discover all available pages before exploring further.

# ERC20Plus

> Enhanced upgradeable ERC20 token with enterprise controls: RBAC mint/burn, three-mode allowlist, global pause, ERC20Permit, and fund recovery.

`ERC20Plus` is an enhanced, upgradeable ERC20 token that works consistently across EVM chains supported by LayerZero, without relying on native token standard quirks that vary by chain. It provides administrative controls directly at the token level.

## Feature Comparison

| Feature                        | Standard ERC20 | `ERC20Plus`                                    |
| ------------------------------ | -------------- | ---------------------------------------------- |
| Transfer / Approve / Allowance | Yes            | Yes                                            |
| Role-based mint                | No             | Yes (`MINTER_ROLE`)                            |
| Role-based burn                | No             | Yes (`BURNER_ROLE`)                            |
| Allowlist (3-mode)             | No             | Yes (Open / Blacklist / Whitelist)             |
| Global pause                   | No             | Yes (separate `PAUSER_ROLE` / `UNPAUSER_ROLE`) |
| Fund recovery                  | No             | Yes (`DEFAULT_ADMIN_ROLE`)                     |
| ERC20Permit (EIP-2612)         | Optional       | Built-in                                       |
| Enumerable address lists       | No             | Yes (paginated blacklist/whitelist queries)    |
| Upgradeable                    | Depends        | Yes (EIP-7201 namespaced storage)              |
| RBAC (AccessControl2Step)      | No             | Yes (OpenZeppelin)                             |

## Features

### Role-Based Minting and Burning

`ERC20Plus` defines two roles for token supply management:

```solidity theme={null}
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
```

* **MINTER\_ROLE**: Can call `mint(address _to, uint256 _amount)` to create new tokens
* **BURNER\_ROLE**: Can call `burn(address _from, uint256 _amount)` to destroy tokens

When used with OFTs, the OFT contract must be granted both `MINTER_ROLE` and `BURNER_ROLE` so it can mint tokens on the receive path and burn tokens on the send path.

### Allowlist, Pause, and Fund Recovery

`ERC20Plus` includes a three-mode allowlist (Open / Blacklist / Whitelist), a global pause with separate pauser/unpauser roles, and a fund recovery function for compliance seizures from non-allowlisted addresses. These are documented in detail on the [Extensions](/v2/developers/evm/stablecoin-oft/extensions#token-level-controls-on-erc20plus) page alongside the OFT-level extensions.

### ERC20Permit (EIP-2612)

Built-in support for gasless approvals via signed messages. Users can authorize token spending by signing an off-chain message instead of submitting an on-chain `approve` transaction:

```solidity theme={null}
function permit(
    address owner,
    address spender,
    uint256 value,
    uint256 deadline,
    uint8 v, bytes32 r, bytes32 s
) external;
```

Nonces are available via `nonces(address owner)`.

## Working with OFTs

When `ERC20Plus` is used with the OFT Burn/Mint variant:

1. Deploy `ERC20Plus` on each chain
2. Deploy `OFTBurnMint` on each chain, pointing to the `ERC20Plus` token address
3. Grant `MINTER_ROLE` and `BURNER_ROLE` to the `OFTBurnMint` address on each chain's `ERC20Plus`
4. Set peers and LZ messaging configurations between `OFTBurnMint` contracts across chains

The OFT uses configurable function selectors to call the token's mint/burn functions. For `ERC20Plus`, the default selectors are:

* Mint: `0x40c10f19` (`mint(address,uint256)`)
* Burn: `0x9dc29fac` (`burn(address,uint256)`)

## Next Steps

* [OFTs](/v2/developers/evm/stablecoin-oft/ofts) for choosing the right variant
* [RBAC Reference](/v2/developers/evm/stablecoin-oft/rbac-reference) for roles and access-controlled functions on `ERC20Plus`
