> For the complete documentation index, see [llms.txt](https://docs.bio.xyz/bio/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bio.xyz/bio/developers/dao-setup/evm-contracts/token-contract.md).

# Token Contract

### Key Features

* **Token Minting:**  Controlled minting via MINTER\_ROLE with no supply cap.
* **Transfer Restriction:** Token transfers are initially disabled. Only addresses with TRANSFER\_ROLE, the owner, or mint operations can transfer tokens before transfers are enabled. Transfers can be permanently enabled via the admin using `enableTransfers()`.
* **Access Control Management:** Role-based access control using OpenZeppelin's AccessControlDefaultAdminRules
  * **Default Admin:** Grants the ability to enable transfers and manage roles.
  * **Transfer Role:** Addresses assigned TRANSFER\_ROLE can execute transfers even when transfers are disabled.
  * **Minter Role:** Addresses assigned MINTER\_ROLE are authorized to mint new tokens.

{% embed url="<https://github.com/bio-xyz/token-contracts>" %}

### Token Contract

**Features**

* **Role-Based Access Control**: Implements OpenZeppelin's AccessControlDefaultAdminRules
  * `DEFAULT_ADMIN_ROLE`: Can enable transfers and manage other roles
  * `MINTER_ROLE`: Can mint new tokens
  * `TRANSFER_ROLE`: Can transfer tokens before transfers are enabled
* **Controlled Token Transfers**:
  * Transfers are initially disabled
  * Only addresses with `TRANSFER_ROLE`, the owner, or minting operations can transfer tokens when transfers are disabled
  * Transfers can be enabled by admin (one-way operation - cannot be disabled once enabled)
* **Token Minting**:
  * Controlled minting through `MINTER_ROLE`
  * No maximum supply cap

**Inheritance**

* OpenZeppelin's ERC20
* OpenZeppelin's ERC20Burnable
* OpenZeppelin's AccessControlDefaultAdminRules

**Key Functions**

* `mint(address to, uint256 amount)`: Allows `MINTER_ROLE` to mint new tokens
* `enableTransfers()`: Allows admin to enable transfers for all holders
* `burn(uint256 amount)`: Allows token holders to burn their tokens (inherited from ERC20Burnable)
