> For the complete documentation index, see [llms.txt](https://rep3.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rep3.gitbook.io/docs/wiki/protocol-specs.md).

# Protocol specs

Protocol specifications and capabilities

> rep3 protocol is currently live on Polygon Mainnet and Polygon Mumbai. Base, Arbitrum, Optimism, Avalanche coming soon.

## ERC721 Reward[​](https://docs.rep3.gg/rep3-protocol/architecture#contracts) <a href="#contracts" id="contracts"></a>

#### Contracts -> <a href="#contracts" id="contracts"></a>

**1. Badge:** The badge is the our ERC721 implementation for NFT-based rewards

**2. Badge Factory:** BadgeFactory deploys Beacon proxy contracts with `Badge` as the implementation contract

**3. Router:** The Router is the forwarder contract that forwards requests to proxies (via ERC2771).

**6. Upgradable Beacon:** For more information, see the Beacon proxy API [here](https://docs.openzeppelin.com/contracts/3.x/api/proxy#beacon).

**7. Token:** The rep3 token contract has the following additional storage variables along with ERC721 implementation in [Solmate's ERC721](https://github.com/transmissions11/solmate/tree/main):

* **tier&#x20;*****(uint8)*****:** The 8 bits of this variable store the tier of the badge
* **data&#x20;*****(uint256)*****:** The 256 bits of this variable can store any custom value depending upon the use case for seamless consumption in protocols

#### Capabilities ->

**Admin level settings**

* `MAX_TOKENS_PER_ADDRESS` -> Max tokens allowed per address, default `1`
* Transferability -> If tokens can be transferred by a user, default `false`&#x20;
* Burnability -> If tokens can be burned by a user, default `false`
* Approvability -> If users can set approvals for tokens, default `false`. Set it to true if you want to allow users to sell their NFTs on marketplaces like Opensea etc

**Mint options**

* Direct mint which gives rep3 bot the minter rights
* ECDSA vouchers
* Merkle Root

Admins can set roles as per their need having robust Access and Permissions. We use [Solmate's RolesAuthority](https://github.com/transmissions11/solmate/blob/main/src/auth/authorities/RolesAuthority.sol) for authentication.

#### Metadata ->[​](https://docs.rep3.gg/rep3-protocol/architecture#storage) <a href="#storage" id="storage"></a>

The protocol uses [Arweave](https://www.arweave.org/) to store the metadata associated with tokens
