# Welcome to Bocto!

## <mark style="color:$primary;">Your All-in-One Web3 Community Bot!</mark>

Discover the power of NFT statistics, role verification, and marketplace insights right inside your **Discord** server. From <mark style="color:$warning;">**Ethereum**</mark> to <mark style="color:$warning;">**Solana**</mark>, <mark style="color:$warning;">**OpenSea**</mark> to <mark style="color:$warning;">**MagicEden**</mark> – <mark style="color:purple;">**Bocto**</mark> brings the Web3 universe to your community in real time.

## <mark style="color:$primary;">Communities trust Bocto to:</mark>

* Provide **automated NFT updates**.
* Offer **secure token-gated roles**.
* Protect your server with **smart moderation**.
* Connect with **major marketplaces** like <mark style="color:$warning;">**OpenSea**</mark>, and <mark style="color:$warning;">**MagicEden**</mark>.


# Creating/Deleting User Profile

## Creating User Account

To start creating your Bocto user account, click the Login button on the top-right of the Bocto main page.

<figure><img src="/files/55zbtxhwHNIlVlKWZSRc" alt=""><figcaption></figcaption></figure>

The Discord authorization pop-up will appear.

<figure><img src="/files/y3nyQnB0Bhs7dfjt3cL9" alt=""><figcaption></figcaption></figure>

When Bocto is authorized, the Login button will change to display your Discord PFP with a small chevron icon; click on it.

<figure><img src="/files/ElmSUcAWi3bUi5KJ0YR5" alt=""><figcaption></figcaption></figure>

In the appeared menu, click on Account:

<figure><img src="/files/9CBf346hC534hBxBx5YA" alt=""><figcaption></figcaption></figure>

Congratulations! Your Bocto user account has been created!

<figure><img src="/files/h6FnteOYizqEQTZRow5u" alt=""><figcaption></figcaption></figure>

Now check the Account Overview page.

## Deleting User Account

If you decided to delete your Bocto User Account, move to the very bottom of the Profile tab on the Account page to the **Danger Zone** section and click on the `Delete My Account` button.

<figure><img src="/files/HMRuk45D00EatqF684UN" alt=""><figcaption></figcaption></figure>

Then, confirm the action in the pop-up window that appears. All your data will be deleted.

<figure><img src="/files/MZtZYAuCvZDp8y9e3vxF" alt=""><figcaption></figcaption></figure>

All your data will be deleted, and you will be logged out and redirected to the main page.

<figure><img src="/files/iVhH6zubmfdDhmKyfYhU" alt=""><figcaption></figcaption></figure>


# User Profile Overview

## <mark style="color:$primary;">Account Tab.</mark>

This tab consists of several main blocks:

* Personal details management section (displays on the user's public profile page).
* Social accounts management section (also displays on the user's public profile page).
* Danger Zone, where you can [delete your Bocto user account](/user-profile/creating-deleting-user-profile#deleting-user-account).

<figure><img src="/files/vPB8ZlK5LwqZENY9RDd6" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Wallets Tab.</mark>

This tab contains the list of all your added wallets, as well as tools to add and remove wallets.

<figure><img src="/files/fajvt9g7A7fjuIFGMEGy" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Roles Tab.</mark>

In this tab, you can see a list of all roles assigned to you via Bocto, if any, on the servers where Bocto is used.

<figure><img src="/files/kgSXwdMU43yuCFsYfMCE" alt=""><figcaption></figcaption></figure>

Click on the `Roles` button in front of the desired server to see the exact roles that were assigned to you by Bocto on that server.

<figure><img src="/files/x76DahaYBQi3fXxYmvqn" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Premium Tab.</mark>

This tab is intended for server owners and, in the future, will contain information and tools for managing Bocto premium ties and subscriptions. This tab is currently unavailable.

## <mark style="color:$primary;">Billing Tab.</mark>

This tab is also intended for server owners only and, in the future, will contain the billing history. This tab is currently unavailable.


# Adding/Removing Wallets

## <mark style="color:$primary;">Adding Wallets.</mark>

Before you will be able to get the holder's roles on the servers with <mark style="color:purple;">**Bocto**</mark> verification, you need to add your wallets to the <mark style="color:purple;">**Bocto**</mark> database. For this, visit the <mark style="color:$success;">**Wallets**</mark> tab on the user's account page.

<figure><img src="/files/B0tZugiYg3jdZZFa4rI6" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">Direct Connection Method.</mark>

This method of adding a wallet requires its direct connection to the <mark style="color:purple;">**Bocto**</mark> website and a read-only transaction signature to prove that you really control this wallet. When it's done, we remember it and disconnect your wallet from our website. It's a simple and versatile workflow that is used by other token-gated bots as a best practice.&#x20;

{% hint style="warning" %}
However, as long as we're getting temporary full access to your wallet, this requires your trust.&#x20;
{% endhint %}

The main advantage of this connection method, besides its simplicity, is that it works with all supported <mark style="color:$success;">EVM</mark> blockchains. That is, if the server owner has their collection on the blockchain other than <mark style="color:$warning;">**Ethereum**</mark>, <mark style="color:$warning;">**Polygon**</mark>, or <mark style="color:$warning;">**Solana**</mark>, you will not have any other option to get verified.

To use this verification method, follow this guide:

{% content-ref url="/pages/f6GjNxg5j8Sl163Y588p" %}
[Direct Connection Method](/user-profile/adding-removing-wallets/direct-connection-method)
{% endcontent-ref %}

### <mark style="color:purple;">Indirect Verification Methods.</mark>

These methods of adding a wallet don't require directly connecting the wallet to the <mark style="color:purple;">**Bocto**</mark> website or signing the transaction. The main disadvantage of this type of wallet ownership verification is that it only works with <mark style="color:$warning;">**Ethereum**</mark>, <mark style="color:$warning;">**Polygon**</mark>, and <mark style="color:$warning;">**Solana**</mark>.

To use this verification method, follow this guide:

{% content-ref url="/pages/FI1xODAE6VaWJWXWpIFA" %}
[Indirect Verification Methods](/user-profile/adding-removing-wallets/indirect-verification-methods)
{% endcontent-ref %}

## <mark style="color:$primary;">Removing Wallets.</mark>

To remove (disconnect) your wallets, use the trash bin buttons in front of the chosen wallet in the wallets list:

<figure><img src="/files/W2zqaWLI0UXQqa4EREL7" alt=""><figcaption></figcaption></figure>

If you don't see these buttons because of a narrow screen, just press and hold the cursor or a finger (on a mobile device) on any place in the <mark style="color:$info;">**Connected Wallets**</mark> section and drag it to the right:

<figure><img src="/files/7DSXJjp9WcJ6r0rLH2Y6" alt=""><figcaption></figcaption></figure>


# Direct Connection Method

## <mark style="color:$primary;">Adding the EVM chain wallet via MetaMask.</mark>

### <mark style="color:purple;">Establishing a connection.</mark>

Before you start, ensure that you are logged in to your **MetaMask** and that the right wallet address and chain for connection are selected. Then, click the `Connect Wallet` button.

<figure><img src="/files/YTq43bwclid9FtLLz9dy" alt=""><figcaption></figcaption></figure>

The **Connect Wallet** extension pop-up window will appear. Choose the wallet extension (for desktop) or a wallet app (on mobile) you want to use to connect with. For the <mark style="color:$success;">EVM</mark> chains, we recommend using **MetaMask**.

{% hint style="danger" %}
You can also try other extensions/apps from the list, but we can't guarantee a successful experience in this case!
{% endhint %}

<figure><img src="/files/kLeOKQAbUkvBqggI24v7" alt=""><figcaption></figcaption></figure>

At the next step, choose **EVM Networks.**

<figure><img src="/files/2OaDB4bvnNKct9EqDNnF" alt=""><figcaption></figcaption></figure>

At this step, **MetaMask** will offer you to confirm that you really want to connect your wallet to the <mark style="color:purple;">**Bocto**</mark> website. Click `Connect` to confirm.

<figure><img src="/files/9G6yXg16dfyz5kFPKayx" alt=""><figcaption></figcaption></figure>

Great! <mark style="color:purple;">**Bocto**</mark> has just detected your wallet! <mark style="color:$danger;">But hasn't bound it to our database yet!</mark>

### <mark style="color:purple;">Connection management.</mark>

The connection is established successfully; however, take a closer look at the marked section below and double-check the <mark style="color:$success;">Chain</mark> and <mark style="color:$success;">Address</mark> values. If everything is correct, click the `Bind Wallet` button to finalize the wallet addition process.&#x20;

<figure><img src="/files/Twf8EAfCWCQgjScDtitx" alt=""><figcaption></figcaption></figure>

If, for example, you've noticed that the chain is wrong, click the `Change Network` button, and the pop-up window with the list of <mark style="color:$success;">EVM</mark> chains will appear. In this example, let's choose **Polygon**.

<figure><img src="/files/uZenPS6m3ctUXT5PvBKi" alt=""><figcaption></figcaption></figure>

Now we see **Polygon** as the value for the <mark style="color:$success;">Chain</mark>:

<figure><img src="/files/Hn4w2o07v6zEfGZDjfCr" alt=""><figcaption></figcaption></figure>

If you've noticed that the wallet is wrong, you have to click the `Decline Binding` button, choose the actual address in your **MetaMask**, and restart the process from the beginning.

If everything is correct, click the `Bind Wallet` button to finalize the wallet addition process. You will see your newly added address in the <mark style="color:$success;">**Connected Wallets**</mark> section:

<figure><img src="/files/ayNOm8yG9RMKQc1GPYU8" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
Now you are good to go to the server where you want to receive the holder roles and initiate the [user verification process](/user-profile/user-verification-process).
{% endhint %}

## <mark style="color:$primary;">Adding Solana wallet via Phantom.</mark>

### <mark style="color:purple;">Establishing a connection.</mark>

Before you start, ensure that you are logged in to your **Phantom** and that the right wallet address for connection is selected. Then, click the `Connect Wallet` button.

<figure><img src="/files/YTq43bwclid9FtLLz9dy" alt=""><figcaption></figcaption></figure>

The **Connect Wallet** extension pop-up window will appear. Choose the wallet extension (for desktop) or a wallet app (on mobile) you want to use to connect with. For <mark style="color:$warning;">**Solana**</mark>, we recommend using **Phantom**.

{% hint style="danger" %}
You can also try other extensions/apps from the list, but we can't guarantee a successful experience in this case!
{% endhint %}

<figure><img src="/files/uWIXx1LkR6O52L44ETk1" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
**Be advised!**&#x20;

In some browsers, for example, **Brave**, it might happen that **Phantom** doesn't support <mark style="color:$warning;">**Solana**</mark>! Look at the blockchains icons near **MetaMask** and **Phantom**. If you are facing this exact case, try a different browser.
{% endhint %}

<figure><img src="/files/ej2mZoOr0OqEi8IgBdzX" alt=""><figcaption></figcaption></figure>

If this is not your case, then, at the next step, choose <mark style="color:$warning;">**Solana**</mark>**.**

<figure><img src="/files/xQeKNySCaHRkbAQZ1bL0" alt=""><figcaption></figcaption></figure>

At this step, **Phantom** will offer you to confirm that you really want to connect your wallet to the <mark style="color:purple;">**Bocto**</mark> website. Click `Connect` to confirm.

<figure><img src="/files/KvVC0OS28Omh6ZFiPXEo" alt=""><figcaption></figcaption></figure>

Great! <mark style="color:purple;">**Bocto**</mark> has just detected your wallet! <mark style="color:$danger;">But hasn't bound it to our database yet!</mark>

### <mark style="color:purple;">Connection management.</mark>

The connection is established successfully; however, take a closer look at the marked section below and double-check the <mark style="color:$success;">Chain</mark> and <mark style="color:$success;">Address</mark> values. If everything is correct, click the `Bind Wallet` button to finalize the wallet addition process.&#x20;

<figure><img src="/files/6UjVtGhEEIeivls2DwDx" alt=""><figcaption></figcaption></figure>

If you've noticed that the wallet (or even the network, because of the browser bug mentioned earlier) is wrong, you have to click the `Decline Binding` button, choose the actual address in your **Phantom** (and use a different browser if needed), and restart the process from the beginning.

If everything is correct, click the `Bind Wallet` button to finalize the wallet addition process. You will see your newly added address in the <mark style="color:$success;">**Connected Wallets**</mark> section:

<figure><img src="/files/0jKTmPPKrVBtsjToONPK" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
Now you are good to go to the server where you want to receive the holder roles and initiate the [user verification process](/user-profile/user-verification-process).
{% endhint %}


# Indirect Verification Methods

## <mark style="color:$primary;">Self-Transaction Method.</mark>

**Self-transaction** is just a regular transaction when you send crypto like you always do, but with a slight specificity: instead of someone else's wallet, you send crypto to the same wallet from which you send it (to itself). It is the same as you, for example, want to send money from your credit card to the same credit card.

In a fiat world, it sounds like nonsense, but in crypto, it is possible and even reasonable, because we can track the blockchain, find this transaction, and thus, ensure that you really control the wallet. At the same time, you do not need to connect your wallet directly to the <mark style="color:purple;">**Bocto**</mark> website and sign any transactions on it. Sadly, this method only works with <mark style="color:$warning;">**Ethereum**</mark>, <mark style="color:$warning;">**Polygon**</mark>, or <mark style="color:$warning;">**Solana**</mark>.

In the example below, we will use **MetaMask**; however, you can use any other EVM-compatible wallet extension/app (for <mark style="color:$warning;">**EVM**</mark> blockchains) or **Phantom**, or any other Solana-compatible wallets for the <mark style="color:$warning;">**Solana**</mark> blockchain.

### <mark style="color:purple;">Initiating Verification on the Bocto's Side.</mark>

Before you start, ensure that you are logged in to your **MetaMask** (or other EVM-compatible wallet extension/app) and that the right wallet address is selected. Then, click the `Add Wallet` button.

<figure><img src="/files/12KWDflI4Ewm6bjxuff2" alt=""><figcaption></figcaption></figure>

The <mark style="color:$success;">Add Wallet</mark> pop-up window will appear. In the <mark style="color:$success;">**Chain**</mark> dropdown, choose the blockchain where the NFTs, the ownership of which you want to verify, are being hosted. In our case, it will be <mark style="color:$warning;">**Polygon**</mark>:

<figure><img src="/files/PtZ0AmndG2MRGVeyvwYY" alt=""><figcaption></figcaption></figure>

In the <mark style="color:$success;">**Verification Type**</mark>, choose <mark style="color:$success;">**Self Transaction**</mark>:

<figure><img src="/files/BqiNPckKS59rZsuUbFMe" alt=""><figcaption></figcaption></figure>

At the next step, the <mark style="color:$success;">**Wallet Address**</mark> field will appear. Paste your wallet into this field, wait for a few seconds until <mark style="color:purple;">**Bocto**</mark> checks if the address format is valid, and when the `Add Wallet` button becomes active, click on it:

<figure><img src="/files/F7YzkJDwG4C2UMKVc9Y8" alt=""><figcaption></figcaption></figure>

The <mark style="color:$info;">Add Wallet</mark> pop-up window will be closed automatically, and the <mark style="color:$info;">Wallet Verification in Process section</mark> with the details of the operation will appear. Double-check if the blockchain and address were set correctly.

If you've noticed that you had been mistaken when filling out the form, cancel the operation by clicking on the `Decline Binding` button.

If everything is correct, copy the number from the special field by clicking on the **Copy** icon:

<figure><img src="/files/hgOwxDjoCPkJouplLWaV" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">Providing the Self-Transaction via Crypto Wallet.</mark>

Now, open your wallet (in our case, it will be **MetaMask**) and ensure that the desired wallet is active. Then, click on the appropriate coin (as we are connecting a wallet on <mark style="color:$warning;">**Polygon**</mark> in this example, it will be, of course, **POL**):

<figure><img src="/files/E31H6wRbfZ6HXWrZOBDD" alt="" width="375"><figcaption></figcaption></figure>

Now click on the **Send** button:

<figure><img src="/files/fDFmKr8Yaq5Vxvz4sydb" alt="" width="375"><figcaption></figcaption></figure>

On the next step, do not fill the <mark style="color:$success;">**To**</mark> address field, but scroll down and find the same address as above in the list instead:

<figure><img src="/files/qDbGWN1vzsDnh0TWqBF7" alt="" width="375"><figcaption></figcaption></figure>

Now check again that the addresses in the <mark style="color:$primary;">**From**</mark> and <mark style="color:$success;">**To**</mark> fields are the same, paste the number you copied a few steps ago, and click **Continue**.

<figure><img src="/files/Dc7sGOIZQwEKNtNFWGJu" alt="" width="375"><figcaption></figcaption></figure>

Confirm the operation:

<figure><img src="/files/mlWfkkZLbkMcCopZQ5Yo" alt="" width="375"><figcaption></figcaption></figure>

Now wait until the transaction changes status from <mark style="color:yellow;">Pending</mark> to <mark style="color:green;">Confirmed</mark>:

<figure><img src="/files/Oq3y1PkqKhBK1KRIUk9X" alt="" width="375"><figcaption></figcaption></figure>

### <mark style="color:purple;">Finalizing Verification on the Bocto's Side.</mark>

When it's done, go back to the Wallets tab on your <mark style="color:purple;">**Bocto**</mark> profile page, and click the `Initiate Check` button:

<figure><img src="/files/OH2UB958dHG1Wmk8CvNb" alt=""><figcaption></figcaption></figure>

If your self-transaction was correct and didn't mess anything up, your <mark style="color:$warning;">**Polygon**</mark> wallet will appear in the list:

<figure><img src="/files/cVnm3jGmdoYPHYUeyrS3" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
Now you are good to go to the server where you want to receive the holder roles and initiate the [user verification process](/user-profile/user-verification-process).
{% endhint %}

## <mark style="color:$primary;">Marketplace-Bio Method.</mark>

The essence of this verification method is that you add a special signature to your user bio on the desired marketplace, and, as long as this is only possible if you are authorized on that marketplace with your wallet, we can ensure that you control this wallet.

In the example below, we will connect the <mark style="color:$warning;">**Ethereum**</mark> wallet and use the account on <mark style="color:$warning;">**OpenSea**</mark> for this purpose because it is currently the only marketplace whose API provides an endpoint with the user's bio. However, in the future, we are going to add some new marketplaces.

### <mark style="color:purple;">Initiating Verification on the Bocto's Side.</mark>

Before you start, ensure that you are logged in to your **MetaMask** (or other EVM-compatible wallet extension/app) and that the right wallet address is selected. Then, click the `Add Wallet` button.

<figure><img src="/files/12KWDflI4Ewm6bjxuff2" alt=""><figcaption></figcaption></figure>

The <mark style="color:$info;">Add Wallet</mark> pop-up window will appear. In the <mark style="color:$success;">**Chain**</mark> dropdown, choose the blockchain where the NFTs, the ownership of which you want to verify, are being hosted. In our case, it will be <mark style="color:$warning;">**Ethereum**</mark>:

<figure><img src="/files/PtZ0AmndG2MRGVeyvwYY" alt=""><figcaption></figcaption></figure>

In the <mark style="color:$success;">**Verification Type**</mark>, choose <mark style="color:$success;">**Marketplace**</mark>:

<figure><img src="/files/QyZwuwlSM1DMmNzWfR88" alt=""><figcaption></figcaption></figure>

At the next step, the <mark style="color:$success;">**Marketplace**</mark> and the <mark style="color:$success;">**Wallet Address**</mark> fields will appear. In the <mark style="color:$success;">**Marketplace**</mark> dropdown, choose <mark style="color:$warning;">**OpenSea**</mark>:

<figure><img src="/files/MIOd9ryrfNkadSsF0San" alt=""><figcaption></figcaption></figure>

In the <mark style="color:$success;">**Wallet Address**</mark> field, paste your wallet, wait for a few seconds until <mark style="color:purple;">**Bocto**</mark> checks if the address format is valid, and when the `Add Wallet` button becomes active, click on it:

<figure><img src="/files/DO5QBdUDD9JaQrOR6zcV" alt=""><figcaption></figcaption></figure>

The <mark style="color:$info;">Add Wallet</mark> pop-up window will be closed automatically, and the <mark style="color:$info;">Wallet Verification in Process</mark> section with the details of the operation will appear.

If, for some reason, you've changed your mind, cancel the operation by clicking on the `Decline Binding` button.

If everything is OK, copy the text from the special field by clicking on the **Copy** icon:

<figure><img src="/files/MJd8J5lRPf01VaZkuN1S" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">Adding the String to the OpenSea Bio.</mark>

Now, being logged in to the <mark style="color:$warning;">**OpenSea**</mark> account via the wallet with the NFTs whose holder you want to verify, click on the user avatar:

<figure><img src="/files/FmB4AK7s3hyjlmSj2xmm" alt=""><figcaption></figcaption></figure>

You will be redirected to your <mark style="color:$warning;">**OpenSea**</mark> profile. Here, click on the **Pencil** icon to start editing your personal information:

<figure><img src="/files/VIrcQlFVPIUVtiv51DMx" alt=""><figcaption></figcaption></figure>

In the <mark style="color:$success;">**Bio**</mark> field, paste the text you copied a few steps ago, and click **Save**.

<figure><img src="/files/Z1kOgOdpbP7CYPR2Qgtu" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">Finalizing Verification on the Bocto's Side.</mark>

When it's done, go back to the <mark style="color:$info;">Wallets</mark> tab on your <mark style="color:purple;">**Bocto**</mark> profile page, and click the `Initiate Check` button:

<figure><img src="/files/Sy9yRmX2LPsb4JVRWs7G" alt=""><figcaption></figcaption></figure>

If your self-transaction was correct and didn't mess anything up, your <mark style="color:$warning;">**Ethereum**</mark> wallet will appear in the list:

<figure><img src="/files/AYzLrS2LQuEA4O4SfYki" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
Now you are good to go to the server where you want to receive the holder roles and initiate the [user verification process](/user-profile/user-verification-process).
{% endhint %}


# User Verification Process

## <mark style="color:$primary;">Verification Pipeline.</mark>

### <mark style="color:purple;">Step 1 - Initiating Verification.</mark>

To claim the roles on the server with <mark style="color:purple;">**Bocto**</mark>, look for the corresponding channel that contains this widget and click the `Start Verification` button.

<figure><img src="/files/FyqXwtxikgv3sBzjHRCv" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">Step 2 - Creating Bocto User Profile (Optional).</mark>&#x20;

If you don't have a <mark style="color:purple;">**Bocto**</mark> user profile yet, this message will appear:

<figure><img src="/files/HePAG7PgbGzarDkUEZLS" alt=""><figcaption></figcaption></figure>

To create the profile and add wallets, click the `Click here to log in` button to visit the <mark style="color:purple;">**Bocto**</mark> website and follow this guide:

{% content-ref url="/pages/cgD0Sey6R4Xj06pwkxpO" %}
[Creating/Deleting User Profile](/user-profile/creating-deleting-user-profile)
{% endcontent-ref %}

Then come back and click the `Start Verification` button again.

### <mark style="color:purple;">Step 3 - Adding User Wallets (Optional).</mark>

This time, <mark style="color:purple;">**Bocto**</mark> will ask you to add wallets if you didn't do it right after creating your profile:

<figure><img src="/files/DURlGYxi5Ytdr9bxqjtY" alt=""><figcaption></figcaption></figure>

To add wallets, click the `Add Wallet from Dashboard` button to visit the <mark style="color:purple;">**Bocto**</mark> website one more time and follow this guide:

{% content-ref url="/pages/CBwJtCLYSkRrlYQHKCAb" %}
[Adding/Removing Wallets](/user-profile/adding-removing-wallets)
{% endcontent-ref %}

Then come back, scroll up to the very first embed, and click the `Start Verification` button again.

### <mark style="color:purple;">Step 4 - Assigning Roles.</mark>

Now you will see this picture - <mark style="color:purple;">**Bocto**</mark> is running a scan across all your added wallets:

<figure><img src="/files/fynVHZOP8PmbO7FahHZt" alt=""><figcaption></figcaption></figure>

And when it finishes, you will see the embed with the scan summary, where:

* <mark style="color:$info;">**New Roles Added**</mark> - <mark style="color:purple;">**Bocto**</mark> roles added during the current verification session.
* <mark style="color:$info;">**Roles Removed**</mark> - <mark style="color:purple;">**Bocto**</mark> roles removed during the current verification session.
* <mark style="color:$info;">**Current Roles**</mark> - All <mark style="color:purple;">**Bocto**</mark> roles you currently have as a result of all verification sessions.

<figure><img src="/files/XEK7Jvf4El4a9n0W4NUR" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Verification Frequency.</mark>

For manual user-initiated verification (the one that was described above), there are no frequency limits, just a 1-minute cooldown. This means that if, during the day, you buy several NFTs of the projects that use <mark style="color:purple;">**Bocto**</mark> verification on their servers, you can initiate the verification process again and again on every new (or even the same) server to renew your holder status.

<mark style="color:purple;">**Bocto**</mark> also uses automatic and manual server owner-initiated verification, the frequency of which depends on the selected premium plan. You can see the details [here](/plugins/verify-roles/introduction#capabilities-comparison). That means that if getting roles is not urgent for you, <mark style="color:purple;">**Bocto**</mark> will automatically monitor your holder's status in the background, checking your wallets at regular intervals. And yes, that means you don't even need to initiate verification yourself - eventually, <mark style="color:purple;">**Bocto**</mark> will assign (or remove) the appropriate roles on all associated servers anyway.


# Core Features

| Feature                                   | Description                                                                                                                                                         |
| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [**Verify Roles**](/plugins/verify-roles) | Assign roles based on NFT ownership or token balance                                                                                                                |
| [**NFT Tracker**](/plugins/nft-tracker)   | Track your NFT collection mints, listings, and sales                                                                                                                |
| [**NFT Stats**](/plugins/nft-stats)       | Create channels that automatically update with real-time NFT stats (floor, volume, sales)                                                                           |
| [**Guard**](/plugins/guard)               | Protect your community from suspicious links, embeds, and users with transparent profile pictures                                                                   |
| [**Mini Games**](/plugins/mini-games)     | Entertain your community with simple activities like daily GM word streaks and reward the automatically choosen winners                                             |
| [**Utilities**](/plugins/utilities)       | Use simple and handly tools to track your user activity and get their addresses for rewards easily if they were verified via [Verify Roles](/plugins/verify-roles). |
| **Task Manager** *(Coming Soon)*          | Simple, team-focused task lists managed inside Discord                                                                                                              |


# Chains & Marketplaces

## <mark style="color:$primary;">Supported Chains and Token Types.</mark>

### <mark style="color:purple;">Supported EVM Chains.</mark>

The so-called <mark style="color:$warning;">**EVM**</mark> chains are a big family of blockchains, compatible with the [Ethereum Virtual Machine](https://ethereum.org/developers/docs/evm/). They can have **L2** (Layer 2) and even **L3** (Layer 3) subchains of a Layer 1 blockchain, like <mark style="color:$warning;">**Ethereum**</mark> itself, and use some different mechanisms, but their standards and core approach are very similar. This is why we position them separately in this documentation.

Below is a list of the <mark style="color:$warning;">**EVM**</mark> chains we currently support:

<table><thead><tr><th>L1 EVM Chains</th><th width="249">L2 EVM Chains</th><th>L3 EVM Chains</th></tr></thead><tbody><tr><td>Ethereum <code>stable</code></td><td>Arbitrum <code>beta</code></td><td>ApeChain <code>beta</code></td></tr><tr><td></td><td></td><td>Xai <code>beta</code></td></tr><tr><td></td><td>Base <code>testing</code></td><td>Degen Chain <code>beta</code></td></tr><tr><td></td><td>Blast <code>beta</code></td><td></td></tr><tr><td></td><td>Linea <code>beta</code></td><td></td></tr><tr><td></td><td>Mantle <code>beta</code></td><td></td></tr><tr><td></td><td>Mode <code>beta</code></td><td></td></tr><tr><td></td><td>Optimism <code>beta</code></td><td></td></tr><tr><td></td><td>Zora <code>beta</code></td><td></td></tr><tr><td>Polygon <code>stable</code></td><td></td><td></td></tr><tr><td>Abstract <code>beta</code></td><td></td><td></td></tr><tr><td>Aurora <code>beta</code></td><td></td><td></td></tr><tr><td>Avalanche <code>beta</code></td><td></td><td></td></tr><tr><td>Berachain <code>beta</code></td><td></td><td></td></tr><tr><td>BNB Smart Chain <code>beta</code></td><td></td><td></td></tr><tr><td>Celo <code>beta</code></td><td></td><td></td></tr><tr><td>Cronos <code>beta</code></td><td></td><td></td></tr><tr><td>Fantom <code>beta</code></td><td></td><td></td></tr><tr><td>Gnosis <code>beta</code></td><td></td><td></td></tr><tr><td>Moonbeam <code>beta</code></td><td></td><td></td></tr><tr><td>Moonriver <code>beta</code></td><td></td><td></td></tr><tr><td>Ronin <code>beta</code></td><td></td><td></td></tr><tr><td>Sei <code>beta</code></td><td></td><td></td></tr></tbody></table>

### <mark style="color:purple;">Other Supported Chains.</mark>

Here is a list of other (non-EVM) **Layer 1** blockchains we currently support:

<table><thead><tr><th width="249">L1 Chains</th><th width="250">L2 Chains</th><th width="249">L3 Chains</th></tr></thead><tbody><tr><td>Solana <code>stable</code></td><td></td><td></td></tr></tbody></table>

{% hint style="warning" %}
**Legend.**

The `stable` status means this blockchain integration has been tested numerous times with all applicable plugins by the community and us, and works stably.

The `testing` status means this blockchain integration is currently showing good results in our internal testing, but hasn't been tested by the community yet.

The `beta` status means we haven't tested this blockchain integration yet, so the declared plugin features might not work with it as they should.
{% endhint %}

### <mark style="color:purple;">Supported Token Types.</mark>

In this guide, we will use the <mark style="color:yellow;">**Collectibles NFT collection type**</mark> and the <mark style="color:yellow;">**Editions NFT collection type**</mark> terms because, unlike classic <mark style="color:$primary;">ERC-721</mark> (**Collectibles**, aka **1 of 1** or **One of its type NFTs**) and <mark style="color:$primary;">ERC-1155</mark> (**NFT Editions**) <mark style="color:$warning;">**EVM**</mark> contract standards, <mark style="color:$warning;">**Solana**</mark> (and other blockchains) has the same conceptual NFT contract types, however the standard names they use are always different. For the same reason, we will use the <mark style="color:yellow;">**Coin**</mark> term to describe the custom token contract type independently of the chain.

The table below lists contract types and their corresponding standards as they are named on the blockchains we currently support.

<table><thead><tr><th width="192">Chains and Standards</th><th width="181">Collectibles</th><th width="177">Editions</th><th>Custom Tokens (Coins)</th></tr></thead><tbody><tr><td>EVM chains</td><td>ERC-721</td><td>ERC-1155</td><td>ERC-20</td></tr><tr><td>Solana</td><td>Metaplex NFT</td><td>Metaplex FT</td><td>SPL Token</td></tr></tbody></table>

## <mark style="color:$primary;">Supported Marketplaces.</mark>

<table><thead><tr><th width="156">Plugin</th><th width="389">Feature</th><th>Marketplace</th></tr></thead><tbody><tr><td><mark style="color:blue;"><strong>Verify Roles</strong></mark></td><td>OpenSea-Based Roles</td><td><mark style="color:$warning;"><strong><code>OpenSea</code></strong></mark></td></tr><tr><td><mark style="color:blue;"><strong>Verify Roles</strong></mark></td><td>Specific Collectibles NFT Traits-Based Roles</td><td><mark style="color:$warning;"><strong><code>OpenSea</code></strong></mark> <mark style="color:$warning;"><strong><code>MagicEden</code></strong></mark></td></tr><tr><td><mark style="color:blue;"><strong>NFT Tracker</strong></mark></td><td>Discord Listigs and Sales</td><td><mark style="color:$warning;"><strong><code>OpenSea</code></strong></mark> <mark style="color:$warning;"><strong><code>MagicEden</code></strong></mark></td></tr><tr><td><mark style="color:blue;"><strong>NFT Stats</strong></mark></td><td>Sidebar Widget</td><td><mark style="color:$warning;"><strong><code>OpenSea</code></strong></mark> <mark style="color:$warning;"><strong><code>MagicEden</code></strong></mark> <mark style="color:$warning;"><strong><code>LooksRare</code></strong></mark></td></tr><tr><td><mark style="color:blue;"><strong>NFT Stats</strong></mark></td><td>Sidebar Widget</td><td><mark style="color:$warning;"><strong><code>OpenSea</code></strong></mark></td></tr></tbody></table>


# User Dashboard

Manage everything through the Bocto Dashboard:

* Connected Wallets (Ethereum, Solana, Polygon)
* Server Overview
* Plugin Settings
* Collection Management

> 🎮 Example Connected Wallets\
> Polygon: `0xF9e8...87b`\
> Solana: `Bsam2z...JBKd`


# Use Cases

* **NFT Projects**: Automate floor updates, verify holders for gated channels
* **DAOs**: Role verification based on token holdings
* **Communities**: Moderate with built-in Guard and link protection


# Support & Community

Need help or want to vibe with other Octo frens?\
Join our community:

* [Discord Server](https://t.co/cQCLjqiJRD)
* [Twitter](https://x.com/BoctoWeb3)


# Legal & Info

* [Documentation](https://docs.bocto.octopeeps.com)
* [Privacy Policy](https://bocto.octopeeps.com/en/contents/privacy-policy)
* [Terms & Conditions](https://bocto.octopeeps.com/en/contents/terms-and-conditions)


# Setup on Server

## <mark style="color:$primary;">Initialization process.</mark>

### <mark style="color:purple;">**Step 1.**</mark>

To start the setup process, click <mark style="color:purple;">**Add to Discord**</mark> or <mark style="color:purple;">**Login with Discord**</mark>/<mark style="color:purple;">**Login**</mark> (Desktop/Mobile app version) button. You will anyway be redirected to the **Discord** Login pop-up window.

<figure><img src="/files/9JxXazMqUyhoaxw7XlZs" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">**Step 2.**</mark>

If you used the <mark style="color:purple;">**Login with Discord**</mark>/<mark style="color:purple;">**Login**</mark> button, you will see your **Discord** avatar icon (and your **Discord** name on the desktop version). Click it to expand the main user menu and select **Dashboard** - you will be redirected to the **Dashboard** page with the list of the servers (guilds) you manage as a server owner or an admin.

<figure><img src="/files/umsZjc4ML9oerX3j6WU1" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">**Step 3.**</mark>

On the **Dashboard**, click the <mark style="color:purple;">**Setup on Server**</mark> button on the desired server card to launch the bot initialization process.

<figure><img src="/files/zZjoE5NiD9GRxxQCXqiI" alt=""><figcaption></figcaption></figure>

In the appeared **Discord** pop-up window, you will see that the server you want to install <mark style="color:purple;">**Bocto**</mark> to is already chosen from the list. Just press <mark style="color:$success;">**Continue**</mark>.

<figure><img src="/files/G3652a52BJ3yiIGCSuuG" alt=""><figcaption></figcaption></figure>

In case you've clicked <mark style="color:purple;">**Add to Discord**</mark> button on <mark style="color:purple;">**Step 1**</mark>, <mark style="color:purple;">**Step 2**</mark>**,** and <mark style="color:purple;">**Step 3**</mark> will be skipped, and, after being logged in to **Discord**, you will then see the next page in the same **Discord** pop-up window, where you need to choose the server you want to install <mark style="color:purple;">**Bocto**</mark> to manually. Select one and press <mark style="color:$success;">**Continue**</mark>.

<figure><img src="/files/H3FI3LE48GHt4LycVLkn" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">**Step 4.**</mark>

Grant all the permissions required and click <mark style="color:$success;">**Authorize**</mark>.

<mark style="color:$danger;">**Note:**</mark> Don't uncheck any boxes if you don't want to encounter problems with some of the bot's features in the future! A comprehensive list of plugins and permissions they use is provided at the end of this page in the [**Permissions usage**](#permissions-usage) section.

<figure><img src="/files/yh2JdeTVmLnibAn0ZAJq" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">**Step 5.**</mark>

After that, the initialization process will start immediately, and you will see its progress in real-time. Usually it takes no longer than 10 seconds.

<figure><img src="/files/kAKAEE2gSPojjpPhiIjh" alt=""><figcaption></figcaption></figure>

When the initialization process is finished, you will be automatically redirected to the **Settings** page. Here you will see the <mark style="color:yellow;">**#hub**</mark> and the <mark style="color:yellow;">**#alerts**</mark> channel that were automatically created and set up for you during the initialization. Also, after the initial setup, there will always be the main <mark style="color:red;">**red**</mark> (critical) alert, which says the <mark style="color:purple;">**Bocto**</mark> position in the roles hierarchy on your server is not high enough to manage users.

<figure><img src="/files/3sB5KrYDGxD8I9D3xzan" alt=""><figcaption></figcaption></figure>

In the <mark style="color:purple;">**Bocto**</mark>**&#x20;**<mark style="color:yellow;">**#hub**</mark> channel, you will see the info embedded message with a link to the **Dashboard**. Also, all news and updates about new plugins and features will be posted here.

<figure><img src="/files/tzeTeb1ARBISWS3oA2QJ" alt=""><figcaption></figcaption></figure>

In the <mark style="color:purple;">**Bocto**</mark>**&#x20;**<mark style="color:yellow;">**#alerts**</mark> channel, you will see the same critical alert warning you about insufficient <mark style="color:purple;">**Bocto**</mark> position in the roles hierarchy. All other alerts about insufficient permissions, if any, will be posted here.

<figure><img src="/files/4H7chA5ewiIySqxEvQZg" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">**Step 6.**</mark>

Move to the <mark style="color:$primary;">**Roles**</mark> managing section in **Discord** and lift the bot in the roles list closer to the top. The best but not obligatory position is in the top 3. The main demand is that <mark style="color:purple;">**Bocto**</mark> should be higher than any role he is going to manage (for example, assigning roles via the <mark style="color:blue;">**Verify Roles**</mark> or <mark style="color:blue;">**Guard**</mark> plugin). When done, save changes.

<figure><img src="/files/zDTVlzdFUwAp30oxNt6W" alt=""><figcaption></figcaption></figure>

In the <mark style="color:yellow;">**#alerts**</mark> channel, you will see that the issue is resolved. We are now good to go!

<figure><img src="/files/apMC2EBSCVsQf5jl1rxD" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">**Step 7.**</mark>

Go back to the **Settings** page in the **Dashboard**, refresh the page (<mark style="color:$success;">**F5**</mark> on your keyboard), and you will see the <mark style="color:green;">**green**</mark> message. Now you can move to the plugins list by pressing the <mark style="color:purple;">**All Plugins**</mark> button.

<mark style="color:$danger;">**Note:**</mark> The <mark style="color:purple;">**All Plugins**</mark> button will not be clickable until you have a <mark style="color:red;">**red**</mark> alert!

<figure><img src="/files/abSKzV39TgiDTY4j5S7T" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">UI alerts indication.</mark>

If you enter the <mark style="color:purple;">**Bocto**</mark>**&#x20;Dashboard** and see an <mark style="color:orange;">**amber**</mark> dot on a server card, it means there are issues with <mark style="color:purple;">**Bocto**</mark> permissions on this server.

<figure><img src="/files/vbkVwxLbbm1tTFMoULvj" alt=""><figcaption></figcaption></figure>

On the server management page, you will also see this alert on the <mark style="color:purple;">**Global Settings**</mark> button as an <mark style="color:orange;">**amber**</mark> label with a counter that reflects the number of notifications.

<figure><img src="/files/h5IcaPOxGwjL9MkDP0W8" alt=""><figcaption></figcaption></figure>

On the mobile version, to find the button (and the alert label), you need to expand the sidebar first by clicking on a hamburger icon, which will, by the way, be provided with the same <mark style="color:orange;">**amber**</mark> alert dot.

<div><figure><img src="/files/owWAzPtabUTfY1K9MwBa" alt=""><figcaption></figcaption></figure> <figure><img src="/files/sUAJ3BloVU9Hc4ocl7QN" alt=""><figcaption></figcaption></figure></div>

Here's what a list of different alerts might look like if <mark style="color:purple;">**Bocto**</mark> has multiple permission issues on your server.

<figure><img src="/files/bEwYXtEryhyH0bWp3e4N" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Permissions usage.</mark>

Below is a comprehensive list of permissions that <mark style="color:purple;">**Bocto**</mark> currently requests, with explanations of which plugins use each permission.

* Manage Roles (Verify Roles, Guard)
* Manage Channels
* Ban Members
* View Channels
* Send Messages
* Send Messages in Threads
* Create Public Threads
* Create Private Threads
* Manage Messages
* Manage Threads
* Embed Links
* Attach Files
* Read Message History
* Add Reactions
* Pin Messages
* Connect


# Verify Roles

{% content-ref url="/pages/AGpDiWG00CGgqWkjlx66" %}
[Introduction](/plugins/verify-roles/introduction)
{% endcontent-ref %}

{% content-ref url="/pages/Y2dpDzGAgNOz5SATeg1P" %}
[Verification Rules](/plugins/verify-roles/verification-rules)
{% endcontent-ref %}

{% content-ref url="/pages/UPTCtJiavFhhnikhwHrN" %}
[Verification Channel Setup](/plugins/verify-roles/verification-channel-setup)
{% endcontent-ref %}


# Introduction

## <mark style="color:$primary;">Overview.</mark>&#x20;

<mark style="color:blue;">**Verify Roles**</mark> is a plugin that provides your **Discord** server with the **Token Gate** functionality, allowing you to create various verification rules and flexibly assign specific roles to your holders.

{% hint style="warning" %}
For a better understanding of the terms below, read the [Supported Token Types](/basics/chains-marketplaces#supported-token-types-chains) section before.
{% endhint %}

## <mark style="color:$primary;">Verification Rule Types.</mark>

### <mark style="color:purple;">Collectibles Contract-Based Roles.</mark>

Use this rule to assign a specific role to your **Discord** users, regardless of the quantity of NFTs from a particular <mark style="color:yellow;">**Collectibles or Editions NFT collection type**</mark> they own. Works for [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and <mark style="color:$warning;">**Solana**</mark>.

### <mark style="color:purple;">Collectibles OpenSea-Based Roles.</mark>

Use this rule to assign a specific role to your **Discord** users, regardless of the quantity of NFTs from a specific <mark style="color:yellow;">**Collectibles type NFT collection**</mark> they own. Almost the same as the <mark style="color:purple;">**Contract-Based Roles**</mark> rule, but it works via <mark style="color:$warning;">**OpenSea**</mark> [Collection Slug](/appendix/getting-collection-slug-symbol), which makes this rule type work with the collections based on any chain supported by <mark style="color:$warning;">**OpenSea**</mark>.

### <mark style="color:purple;">Collectibles Quantity-Based Roles.</mark>

Use this rule to assign a specific role to your **Discord** users based on a certain number of NFTs from a particular <mark style="color:yellow;">**Collectibles NFT collection type**</mark> they own. Works for [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and <mark style="color:$warning;">**Solana**</mark>.

### <mark style="color:purple;">Specific Collectibles Traits-Based Roles.</mark>

Use this rule to assign a specific role to your **Discord** users based on a specific trait of an NFT from a particular <mark style="color:yellow;">**Collectibles NFT collection type**</mark> they own. Works for <mark style="color:$warning;">**OpenSea**</mark> and <mark style="color:$warning;">**Magic Eden**</mark> (curently only <mark style="color:$warning;">**Solana**</mark>).

### <mark style="color:purple;">Specific Collectibles Token Id(s) Based Roles</mark>

Use this rule to assign a specific role to your **Discord** users based on the specific token ID(s) from a particular <mark style="color:yellow;">**Collectibles NFT collection type**</mark> they own. Works for [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and <mark style="color:$warning;">**Solana**</mark>.

### <mark style="color:purple;">Specific Editions Token Id(s) Based Roles.</mark>

Use this rule to assign a specific role to your **Discord** users, regardless of the quantity of NFTs from a particular <mark style="color:yellow;">**Editions NFT collection type**</mark> they own. Guaranteed to work with the [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains). <mark style="color:red;">Didn't test on</mark> <mark style="color:$warning;">**Solana**</mark>.

### <mark style="color:purple;">Custom Token (Coin) Based Roles.</mark>

Use this rule to assign a specific role to your **Discord** users based on a certain balance of a specified <mark style="color:yellow;">**Coin**</mark> they hold. Works with the [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and <mark style="color:$warning;">**Solana**</mark>.

### <mark style="color:purple;">Collectibles Combo Roles.</mark>

Use this rule to assign a specific role to your **Discord** users, depending on whether they hold at least one NFT from at least one of several NFT collections of a <mark style="color:yellow;">**Collectibles NFT collection type**</mark> or from all of them. Works with the [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and <mark style="color:$warning;">**Solana**</mark>.

### <mark style="color:$danger;">Editions Quantity-Based Roles.</mark>

Use this rule to assign a specific role to your **Discord** users based on a certain number of a particular token ID from the <mark style="color:yellow;">**Editions NFT collection type**</mark> they own. <mark style="color:$danger;">This feature is in development.</mark>

## <mark style="color:$primary;">Capabilities Comparison.</mark>

<table><thead><tr><th width="227">Feature/Tier</th><th>Free</th><th>Plus</th><th>Premium</th></tr></thead><tbody><tr><td>Rules limit per server</td><td>20</td><td>60</td><td>100</td></tr><tr><td>Users limit per server</td><td>No limits</td><td>No limits</td><td>No limits</td></tr><tr><td>Supported blockchains</td><td>All <a href="/pages/iksy9LXAPY82N68KiSmt#supported-evm-chains">supported <mark style="color:$warning;"><strong>EVM</strong></mark> chains</a> and <mark style="color:$warning;"><strong>Solana</strong></mark>.</td><td>All <a href="/pages/iksy9LXAPY82N68KiSmt#supported-evm-chains">supported <mark style="color:$warning;"><strong>EVM</strong></mark> chains</a> and <mark style="color:$warning;"><strong>Solana</strong></mark>.</td><td>All <a href="/pages/iksy9LXAPY82N68KiSmt#supported-evm-chains">supported <mark style="color:$warning;"><strong>EVM</strong></mark> chains</a> and <mark style="color:$warning;"><strong>Solana</strong></mark>.</td></tr><tr><td>Supported contract types</td><td>Collectibles and Editions, Coins</td><td>Collectibles and Editions, Coins</td><td>Collectibles  and Editions, Coins</td></tr><tr><td>Automatic verification data update frequency</td><td>1 time every 3 days</td><td>1 time every 2 days</td><td>Ddaily</td></tr><tr><td>Manual bulk verification data update frequency</td><td>1 time per month</td><td>2 times per month</td><td>3 times per month</td></tr></tbody></table>

## <mark style="color:$primary;">Before Setup.</mark>

To proceed with the collection setup, you need to enable the plugin. To do this, click on the switcher located on the left side of the top bar panel.

<figure><img src="/files/N4T98Q9nemGaFyk2jm6I" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}

Once you've done, proceed to create the [verification rules](/plugins/verify-roles/verification-rules).
{% endhint %}


# Verification Rules

## <mark style="color:$primary;">Verification Rules Activation.</mark>

To start creating the verification rules, you first need to activate them. For this, go to the <mark style="color:$primary;">**Select a Plugin**</mark> page and click on the <mark style="background-color:purple;">`≡ Features`</mark> button on the <mark style="color:blue;">**Verify Roles**</mark> card.

<figure><img src="/files/synlCXDB579OlrUg82yk" alt=""><figcaption></figcaption></figure>

Now, activate the desired rule types by clicking on the switcher on the corresponding card, and confirm activation - one rule type at a time.

<figure><img src="/files/0wwaKBMn5kLSp1QWYvWl" alt=""><figcaption></figcaption></figure>

Now click the <mark style="background-color:purple;">`≡ Configure`</mark> button on the desired rule type card to visit the page with the list of this type of rule.

<figure><img src="/files/tLRfSprGBI4c7zDf8jpr" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Verification Rules Setup.</mark>

To add your first rule, click on the <mark style="background-color:$primary;">`+ Add New Rule`</mark> button to call the rule creation form.

<figure><img src="/files/9Kie5o0ZozkJpNN3aDfG" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Verification Rules List.</mark>

For the detailed instructions on how to set up every particular rule type, visit the corresponding page:

{% content-ref url="/pages/rmg8z3hsjrpG57gpMYc8" %}
[Collectibles Contract-Based Roles](/plugins/verify-roles/verification-rules/collectibles-contract-based-roles)
{% endcontent-ref %}

{% content-ref url="/pages/Vudi0jJxdpL94gkW0biU" %}
[Collectibles Quantity-Based Roles](/plugins/verify-roles/verification-rules/collectibles-quantity-based-roles)
{% endcontent-ref %}

{% content-ref url="/pages/wPfhgXDKXmmMIoYL06l1" %}
[Specific Collectibleы Token Id(s) Based Roles](/plugins/verify-roles/verification-rules/specific-collectibley-token-id-s-based-roles)
{% endcontent-ref %}

{% content-ref url="/pages/sWvQrfHOAi23QOJWANsd" %}
[Specific Editions Token Id(s) Based Roles](/plugins/verify-roles/verification-rules/specific-editions-token-id-s-based-roles)
{% endcontent-ref %}

{% content-ref url="/pages/BxAmhqQRjDJmGvkZlClB" %}
[Specific Collectibles Traits-Based Roles](/plugins/verify-roles/verification-rules/specific-collectibles-traits-based-roles)
{% endcontent-ref %}

{% content-ref url="/pages/yCRLwr51eXMQJvwi2aqU" %}
[Collectibles OpenSea-Based Roles](/plugins/verify-roles/verification-rules/collectibles-opensea-based-roles)
{% endcontent-ref %}

{% content-ref url="/pages/15OsxfT04sfP1GmCDEXx" %}
[Custom Token (Coin) Based Roles](/plugins/verify-roles/verification-rules/custom-token-coin-based-roles)
{% endcontent-ref %}

{% content-ref url="/pages/2k2Ma3MxkPtW3uZ7d88K" %}
[Collectibles Combo Roles](/plugins/verify-roles/verification-rules/collectibles-combo-roles)
{% endcontent-ref %}

{% hint style="success" %}

Once you've done setting up the rules, it's time to [set up the verification channel](/plugins/verify-roles/verification-channel-setup).
{% endhint %}

## <mark style="color:$primary;">Rule Card Buttons Explanation.</mark>

When done, you will see the rule card. Depending on the rule type, the cards could look different, but they all have a common button panel located in the top-right corner of the card.&#x20;

* To **edit** the rule, use the **Pencil** button. It will call the same form you filled out when creating the rule.
* To **delete** a rule, use the **Trash bin** button.
* The rules with the contract address also have a **Copy** button, located to the right of the contract address in the <mark style="color:$primary;">**Contract**</mark> string. Use this button to copy the contract address.

<figure><img src="/files/LxyjAyXfnopfer6ZTzfm" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Rule Limits Display Explanation.</mark>

After adding at least one rule, a statistic widget will appear on this rule type page, where:

* <mark style="color:$primary;">**Current rules**</mark> - the quantity of the rules of this type (number of cards on this page).
* <mark style="color:$primary;">**Total**</mark> - total rules of all types created (number of all cards on all pages).
* <mark style="color:$primary;">**Limit**</mark> - the maximum quantity of rules of all types you can create on your active tier.

<figure><img src="/files/9SgUZ9XiZnOpMjDrrxtl" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Rule Type Cards Badges Explanation.</mark>

After adding at least one rule of any type, when moving back to the list of rule types, you will see the badge in the top-left corner of the corresponding rule type card, which represents the number of created rules of this type.

<figure><img src="/files/mqCfz1an5JfmR5lfCKVQ" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Verification Logs Explanation.</mark>

After the first verification session takes place, the <mark style="color:$primary;">**Verification Logs**</mark> table will appear below the rule types cards section with the following data:

* <mark style="color:$primary;">**Time**</mark> - the date and time the verification session took place.
* <mark style="color:$primary;">**Username**</mark> - the Discord username of the user checked during the verification session.
* <mark style="color:$primary;">**Wallets**</mark> - the list of the wallets that were checked during the verification session.
* <mark style="color:$primary;">**Roles Added**</mark> - the list of the roles that were added during the verification session.
* <mark style="color:$primary;">**Roles Removed**</mark> - the list of the roles that were removed during the verification session.
* <mark style="color:$primary;">**Assets**</mark> - the NFTs or the Coins that were found in the <mark style="color:$success;">Wallets</mark> during the verification session.
* <mark style="color:$primary;">**Action**</mark> - the type of the verification session. It can be <mark style="color:$success;">Auto</mark> (scheduled session) or <mark style="color:$success;">Manual</mark> (session initiated by user).

<figure><img src="/files/Um5rMeVrGiLwhKU7mIfF" alt=""><figcaption></figcaption></figure>


# Collectibles Contract-Based Roles

This is the simplest rule type with the minimum amount of settings, which is perfect if you want to assign a specific role to your **Discord** users, regardless of the number of NFTs from a particular <mark style="color:yellow;">**Collectibles or Editions NFT collection type**</mark> they own. Works for [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and <mark style="color:$warning;">**Solana**</mark>.

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Rule Name**</mark> field, enter your desired rule name.
* In the <mark style="color:$primary;">**Blockchain**</mark> dropdown, select the blockchain where your collection contract is deployed.
* In the <mark style="color:$primary;">**Contract**</mark> field, enter the [collection contract address](/appendix/getting-collection-contract-address).
* In the <mark style="color:$primary;">**Role**</mark> dropdown, select the prepared <mark style="color:yellow;">**@Role**</mark> you wish to assign to the holders.

{% hint style="danger" %}
Be especially careful when setting the <mark style="color:$primary;">**Contract**</mark> field for <mark style="color:$warning;">**Solana**</mark> collections! Check this [link](/appendix/getting-collection-contract-address) before starting!
{% endhint %}

{% hint style="danger" %}
If you set up the <mark style="color:yellow;">**Editions**</mark> collection type instead of the <mark style="color:yellow;">**Collectibles**</mark> type, no error will occur, but the rule won't work!
{% endhint %}

## <mark style="color:$primary;">Setting Up the Rule.</mark>

<figure><img src="/files/PPffrctcycOY8nNBs976" alt=""><figcaption></figcaption></figure>


# Collectibles OpenSea-Based Roles

This rule type allows you to assign a specific role to your **Discord** users, regardless of the number of NFTs from a specific <mark style="color:yellow;">**Collectibles type NFT collection**</mark> they own. Almost identical to the [<mark style="color:purple;">**Collectibles Contract-Based Roles**</mark>](/plugins/verify-roles/verification-rules/collectibles-contract-based-roles) rule, but it operates via an <mark style="color:$warning;">**OpenSea**</mark> [collection slug](/appendix/getting-collection-slug-symbol), which makes this rule type work with the collections based on any chain supported by <mark style="color:$warning;">**OpenSea**</mark>.

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Rule Name**</mark> field, enter your desired rule name.
* In the <mark style="color:$primary;">**Blockchain**</mark> dropdown, select the blockchain where your collection contract is deployed.
* In the <mark style="color:$primary;">**Collection Slug**</mark> field, enter the [collection slug](/appendix/getting-collection-slug-symbol).
* In the <mark style="color:$primary;">**Role**</mark> dropdown, select the prepared <mark style="color:yellow;">**@Role**</mark> you wish to assign to the holders.

{% hint style="danger" %}
If you set up the <mark style="color:yellow;">**Editions**</mark> collection type instead of the <mark style="color:yellow;">**Collectibles**</mark> type, no error will occur, but the rule won't work!
{% endhint %}

## <mark style="color:$primary;">Setting Up the Rule.</mark>

<figure><img src="/files/uBkHjTTu4Q3DuSivxXT4" alt=""><figcaption></figcaption></figure>


# Collectibles Quantity-Based Roles

This rule type allows you to assign a specific role to your **Discord** users based on a certain number of NFTs from a particular <mark style="color:yellow;">**Collectibles NFT collection type**</mark> they own. Works for [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and <mark style="color:$warning;">**Solana**</mark>.

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Rule Name**</mark> field, enter your desired rule name.
* In the <mark style="color:$primary;">**Blockchain**</mark> dropdown, select the blockchain where your collection contract is deployed.
* In the <mark style="color:$primary;">**Contract**</mark> field, enter the [collection contract address](/appendix/getting-collection-contract-address).
* In the <mark style="color:$primary;">**Minimum Balance**</mark> field, enter the minimum number of NFTs a user should hold to get the role.
* In the <mark style="color:$primary;">**Maximum Balance**</mark> field, enter the minimum number of NFTs a user should hold to get the role.
* In the <mark style="color:$primary;">**Role**</mark> dropdown, select the prepared <mark style="color:yellow;">**@Role**</mark> you wish to assign to the holders.

{% hint style="danger" %}
Be especially careful when setting the <mark style="color:$primary;">**Contract**</mark> field for <mark style="color:$warning;">**Solana**</mark> collections! Check this [link](/appendix/getting-collection-contract-address) before starting!
{% endhint %}

{% hint style="danger" %}
If you set up the <mark style="color:yellow;">**Editions**</mark> collection type instead of the <mark style="color:yellow;">**Collectibles**</mark> type, no error will occur, but the rule won't work!
{% endhint %}

## <mark style="color:$primary;">Setting Up Minimum and Maximum Limited Grades.</mark>

<figure><img src="/files/kYZIRYDStFgMsUzhtz3a" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Setting Up Minimum Only Limited Grades.</mark>

As far as the <mark style="color:$primary;">**Maximum Balance**</mark> field is optional, you can use it to keep the upper restriction blank for the latest grade:

<figure><img src="/files/va3cZ23iIUg9209zV6xG" alt=""><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:$danger;">**Note:**</mark> To prevent rule conflicts when creating holder grades, make sure that each time you set the current <mark style="color:$primary;">**Minimum Balance**</mark>, it is exactly +1 higher than the previous range's <mark style="color:$primary;">**Maximum Balance**</mark>.
{% endhint %}


# Specific Collectibles Traits-Based Roles

This rule type allows you to assign a specific role to your **Discord** users based on a specific NFT trait from a particular <mark style="color:yellow;">**Collectibles NFT collection type**</mark> they own. Works for collections launched on [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and listed on <mark style="color:$warning;">**OpenSea**</mark>, and for <mark style="color:$warning;">**Solana**</mark> collections listed on <mark style="color:$warning;">**Magic Eden**</mark>.

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Rule Name**</mark> field, enter your desired rule name.
* In the <mark style="color:$primary;">**Marketplace**</mark> dropdown, select the marketplace where your collection is listed.
* In the <mark style="color:$primary;">**Collection Slug**</mark> or <mark style="color:$primary;">**Collection Symbol**</mark> field (appears only after choosing the <mark style="color:$primary;">**Marketplace**</mark>), enter the [collection slug/symbol](/appendix/getting-collection-slug-symbol).
* In the <mark style="color:$primary;">**Trait**</mark> dropdown, select the desired NFT trait (will appear only if the <mark style="color:$success;">Collection Slug</mark> is correct).
* In the <mark style="color:$primary;">**Role**</mark> dropdown, select the prepared <mark style="color:yellow;">**@Role**</mark> you wish to assign to the holders.

{% hint style="danger" %}
If you set up the <mark style="color:yellow;">**Editions**</mark> collection type instead of the <mark style="color:yellow;">**Collectibles**</mark> type, no error will occur, but the rule won't work!
{% endhint %}

## <mark style="color:$primary;">Setting Up the Rule.</mark>

<figure><img src="/files/g6GQVjNzjTGXWSTDUq7Z" alt=""><figcaption></figcaption></figure>


# Specific Collectibleы Token Id(s) Based Roles

This rule type allows you to assign a specific role to your **Discord** users based on a specific token ID(s) from a particular <mark style="color:yellow;">**Collectibles NFT collection type**</mark> they own. Works for [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and <mark style="color:$warning;">**Solana**</mark>.

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Rule Name**</mark> field, enter your desired rule name.
* In the <mark style="color:$primary;">**Blockchain**</mark> dropdown, select the blockchain where your collection contract is deployed.
* In the <mark style="color:$primary;">**Contract**</mark> field, enter the [collection contract address](/appendix/getting-collection-contract-address).
* In the <mark style="color:$primary;">**Token ID(s)**</mark> field, enter the ID (or IDs) of NFT(s) a user should hold to get the role.
* In the <mark style="color:$primary;">**Role**</mark> dropdown, select the prepared <mark style="color:yellow;">**@Role**</mark> you wish to assign to the holders.

{% hint style="danger" %}
Be especially careful when setting the <mark style="color:$primary;">**Contract**</mark> field for <mark style="color:$warning;">**Solana**</mark> collections! Check this [link](/appendix/getting-collection-contract-address) before starting!
{% endhint %}

{% hint style="danger" %}
If you set up the <mark style="color:yellow;">**Editions**</mark> collection type instead of the <mark style="color:yellow;">**Collectibles**</mark> type, no error will occur, but the rule won't work!
{% endhint %}

## <mark style="color:$primary;">Setting Up Just One ID.</mark>

In case you want to assign users a <mark style="color:yellow;">**@Role**</mark> depending on whether they have only one NFT with the specific ID, it's just as easy:

<figure><img src="/files/4z8jBOmcRSLgCUkuhtJh" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Setting Up Multiple IDs.</mark>

In case you want to assign users a <mark style="color:yellow;">**@Role**</mark> based on whether they possess one of the NFTs with specific IDs, you can list them separated by commas without spaces:

<figure><img src="/files/QB2rbMCtFkv117SoAeSf" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Setting Up a Range of IDs.</mark>

If you want to assign users a <mark style="color:yellow;">**@Role**</mark> based on whether they possess NFTs with specific IDs within a certain range, you can enter the first and last IDs:

<figure><img src="/files/hoLBrTGb7fisvLZdfN5a" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Mixing Up Multiple IDs and ID Ranges.</mark>

You can also mix and flexibly combine the last two variants like this:

{% columns %}
{% column %}
{% hint style="success" %}
329,333,345-350
{% endhint %}

{% hint style="success" %}
329,333,345-350,356,359
{% endhint %}
{% endcolumn %}

{% column %}
{% hint style="success" %}
329-333,345-350
{% endhint %}

{% hint style="success" %}
333,345-350,355,360-369
{% endhint %}
{% endcolumn %}
{% endcolumns %}

This allows you to use only one rule at a time to set IDs and ID ranges separately, rather than using several rules simultaneously.

{% hint style="warning" %}
If you set more than one ID, the rule will be assigned if the holder has any NFT from the list, not all of them!
{% endhint %}


# Specific Editions Token Id(s) Based Roles

This rule type allows you to assign a specific role to your **Discord** users based on a specific token ID(s) from a particular <mark style="color:yellow;">**Editions NFT collection type**</mark> they own. Guaranteed to work with the [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains). <mark style="color:red;">Didn't test on</mark> <mark style="color:$warning;">**Solana**</mark>.

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Rule Name**</mark> field, enter your desired rule name.
* In the <mark style="color:$primary;">**Blockchain**</mark> dropdown, select the blockchain where your collection contract is deployed.
* In the <mark style="color:$primary;">**Contract**</mark> field, enter the valid 1/1 type [collection contract address](/appendix/getting-collection-contract-address) (ERC-1155 for <mark style="color:$warning;">**EVM**</mark> chains).
* In the <mark style="color:$primary;">**Token ID(s)**</mark> field, enter the ID (or IDs) of NFT(s) a user should hold to get the role.
* In the <mark style="color:$primary;">**Role**</mark> dropdown, select the prepared <mark style="color:yellow;">**@Role**</mark> you wish to assign to the holders.

{% hint style="danger" %}
Be especially careful when setting the <mark style="color:$primary;">**Contract**</mark> field for <mark style="color:$warning;">**Solana**</mark> collections! Check this [link](/appendix/getting-collection-contract-address) before starting!
{% endhint %}

{% hint style="danger" %}
If you set up the <mark style="color:yellow;">**Collectibles**</mark> collection type instead of the <mark style="color:yellow;">**Editions**</mark> type, no error will occur, but the rule won't work!
{% endhint %}

## <mark style="color:$primary;">Setting Up Just One ID.</mark>

In case you want to assign users a <mark style="color:yellow;">**@Role**</mark> depending on whether they have only one NFT with the specific ID, it's just as easy:

<figure><img src="/files/WKHo7lgyVUD4jYqWPkeC" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Setting Up Multiple IDs.</mark>

In case you want to assign users a <mark style="color:yellow;">**@Role**</mark> based on whether they possess one of the NFTs with specific IDs, you can list them separated by commas without spaces:

<figure><img src="/files/WbyAj0MQjytwseQpzz0C" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Setting Up a Range of IDs.</mark>

If you want to assign users a <mark style="color:yellow;">**@Role**</mark> based on whether they possess NFTs with specific IDs within a certain range, you can enter the first and last IDs:

<figure><img src="/files/gDV7MrIGcXbGFrFOQ17x" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Mixing Up Multiple IDs and ID Ranges.</mark>

You can also mix and flexibly combine the last two variants like this:

{% columns %}
{% column %}
{% hint style="success" %}
10,12,14-35
{% endhint %}

{% hint style="success" %}
10,12,14-35,56,59
{% endhint %}
{% endcolumn %}

{% column %}
{% hint style="success" %}
14-35,56-59
{% endhint %}

{% hint style="success" %}
10,12,14-35,45,56-59
{% endhint %}
{% endcolumn %}
{% endcolumns %}

This allows you to use only one rule at a time to set IDs and ID ranges separately, rather than using several rules simultaneously.

{% hint style="warning" %}
If you set more than one ID, the rule will be assigned if the holder has any NFT from the list, not all of them!
{% endhint %}


# Custom Token (Coin) Based Roles

This rule type allows you to assign a specific role to your **Discord** users based on a specific amount of a particular <mark style="color:yellow;">**Coin**</mark> they own. Works for [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and <mark style="color:$warning;">**Solana**</mark>.

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Rule Name**</mark> field, enter your desired rule name.
* In the <mark style="color:$primary;">**Blockchain**</mark> dropdown, select the blockchain where your token (<mark style="color:yellow;">**Coin**</mark>) contract is deployed.
* In the <mark style="color:$primary;">**Contract**</mark> field, enter the token (<mark style="color:yellow;">**Coin**</mark>) contract address.
* In the <mark style="color:$primary;">**Required Balance**</mark> field, enter the <mark style="color:yellow;">**Coin**</mark> balance that the user should hold to get the role.
* In the <mark style="color:$primary;">**Role**</mark> dropdown, select the prepared <mark style="color:yellow;">**@Role**</mark> you wish to assign to the holders.

## <mark style="color:$primary;">Setting Up the Rule.</mark>

<figure><img src="/files/eLCkUGtR24SxOQZ5cfvA" alt=""><figcaption></figcaption></figure>


# Collectibles Combo Roles

This rule type allows you to assign a specific role to your **Discord** users, depending on whether they hold at least one NFT from at least one of several NFT collections of a <mark style="color:yellow;">**Collectibles NFT collection type**</mark> or from all of them. Works with the [supported <mark style="color:$warning;">**EVM**</mark> chains](/basics/chains-marketplaces#supported-evm-chains) and <mark style="color:$warning;">**Solana**</mark>.

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Rule Name**</mark> field, enter your desired rule name.
* In the <mark style="color:$primary;">**Blockchain**</mark> dropdown, select the blockchain where your collection contract is deployed.
* In the <mark style="color:$primary;">**Contract Addresses**</mark> fields, enter up to 5 [collection contract addresses](/appendix/getting-collection-contract-address).
* In the <mark style="color:$primary;">**Role**</mark> dropdown, select the prepared <mark style="color:yellow;">**@Role**</mark> you wish to assign to the holders.
* Enable the <mark style="color:$primary;">**Require All**</mark> checkbox if you want to assign this <mark style="color:yellow;">**@Role**</mark> only if the user has at least one NFT from every added collection, not just one of them.

{% hint style="danger" %}
Be especially careful when setting the <mark style="color:$primary;">**Contract**</mark> field for <mark style="color:$warning;">**Solana**</mark> collections! Check this [link](/appendix/getting-collection-contract-address) before starting!
{% endhint %}

{% hint style="danger" %}
If you set up the <mark style="color:yellow;">**Editions**</mark> collection type instead of the <mark style="color:yellow;">**Collectibles**</mark> type, no error will occur, but the rule won't work!
{% endhint %}

## <mark style="color:$primary;">Setting Up the Rule.</mark>

<figure><img src="/files/U97VSYcfQv6WBVWkMhex" alt=""><figcaption></figcaption></figure>


# Verification Channel Setup

When the [verification rules](/plugins/verify-roles/verification-rules) are ready, you can invite your users to initiate the verification process. But first, you need to prepare and set up the verification channel.

To provide your **Discord** server with the token-gated functionality, <mark style="color:purple;">**Bocto**</mark> initially creates an embedded message with a special widget. This widget can be set up using two methods - via the <mark style="color:purple;">**Bocto**</mark> Dashboard and via the **Discord** command.&#x20;

<figure><img src="/files/Hjzeol4L1Q4EXXBtR853" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Setting up the Channel and Permissions.</mark>

Whatever of the two mentioned methods you choose, first you need to prepare the <mark style="color:yellow;">**#nft-verify**</mark> (or name it as you wish) public channel with the [correct channel permissions](/appendix/setting-up-channels-permissions) where you want to set up the verification widget, then come here to continue.

## <mark style="color:$primary;">Setting up the Verification Widget via Dashboard.</mark>

After activating the plugin in the <mark style="color:purple;">**Bocto**</mark> Dashboard and creating the <mark style="color:yellow;">**#nft-verify**</mark> channel in your **Discord**, come back to the <mark style="color:$primary;">**Select a Plugin**</mark> page and click on the `⚙` button to enter the basic plugin settings.

<figure><img src="/files/z2VwuyB6kR39SxRqtkD0" alt=""><figcaption></figcaption></figure>

Now choose the prepared channel - it will take a while to check if <mark style="color:purple;">**Bocto**</mark> has access to this channel. If everything is OK, press the <mark style="background-color:$primary;">**`Save`**</mark> button on the top bar.

<figure><img src="/files/Tpfs0O34t7TVylwOLpHO" alt=""><figcaption></figcaption></figure>

If you see this error: <mark style="color:red;">**Bocto is missing the following permissions for this channel to operate properly: ViewChannel**</mark>, that means your <mark style="color:yellow;">**#nft-verify**</mark> channel is actually private!

<figure><img src="/files/HTW4LPLZFXqPZonkqooE" alt=""><figcaption></figcaption></figure>

To fix it, check again and set up the [correct channel permissions](/appendix/setting-up-channels-permissions), then come back and reload the <mark style="color:$primary;">**Verify Roles Settings**</mark> page. If everything is OK, press the  <mark style="background-color:$primary;">`Save`</mark>  button on the top bar.

After saving the channel in the <mark style="color:purple;">**Bocto**</mark> Dashboard, the embed widget will immediately appear in this channel.

<figure><img src="/files/NLBaqYlBpQo1yYJbm61Z" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Set up the Verification Widget via Discord.</mark>

Alternatively, you can use the special **Discord** command to set up the verification widget. If you prefer this method, call the `/set-verification-channel` command in any channel and in the appeared dropdown, choose the channel for the verification you've prepared. Here is the same rule - this channel must have the [correct channel permissions](/appendix/setting-up-channels-permissions) set up.

<figure><img src="/files/MbvQKuZSOahDC33gIEVU" alt=""><figcaption></figcaption></figure>

If everything is okay with the permissions, the embed widget will immediately appear in this channel.

<figure><img src="/files/NLBaqYlBpQo1yYJbm61Z" alt=""><figcaption></figcaption></figure>

But if you see this message instead, that means your <mark style="color:yellow;">**#nft-verify**</mark> channel is actually private.&#x20;

<figure><img src="/files/FeZ5fDmyZZrQcoKmLvaG" alt=""><figcaption></figcaption></figure>

To fix it, check again and set up the [correct channel permissions](/appendix/setting-up-channels-permissions), then come back and relaunch the command.

When everything is done, visit the <mark style="color:$primary;">**Verify Roles Settings**</mark> page in **Dashboard** to ensure the channel was set automatically. If you kept this page open, refresh it to see the actual state. It should look like this:

<figure><img src="/files/Tpfs0O34t7TVylwOLpHO" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}

Once you've done, invite your users to this channel to start the [user verification process](/user-profile/user-verification-process).
{% endhint %}


# NFT Tracker

{% content-ref url="/pages/qURgd3igwo8QLCrGNIW8" %}
[Introduction](/plugins/nft-tracker/introduction)
{% endcontent-ref %}

{% content-ref url="/pages/JaAs47zY5ykg7Zhu1Qv3" %}
[Discord Tracker Rules](/plugins/nft-tracker/discord-tracker-rules)
{% endcontent-ref %}


# Introduction

## <mark style="color:$primary;">Overview.</mark>&#x20;

<mark style="color:blue;">**NFT Tracker**</mark> is a plugin that provides your socials with the information about mints, listings, and sales of the NFTs from your collections. In combination with the [<mark style="color:blue;">**NFT Stats**</mark>](/plugins/nft-stats) plugin, it is a great way to demonstrate your NFT collection dynamics to the community. Currently works only for <mark style="color:$warning;">**Discord**</mark>.

## <mark style="color:$primary;">Discord NFT Multi Tracker.</mark>

The <mark style="color:$primary;">**Discord NFT Multi Tracker**</mark> is the <mark style="color:blue;">**NFT Tracker**</mark> feature that allows you to track and post your NFT collection <mark style="color:$danger;">**Mint**</mark>, <mark style="color:$danger;">**Listing**</mark>, and <mark style="color:$danger;">**Sale**</mark> events in your **Discord** server.

## <mark style="color:$primary;">Capabilities Comparison.</mark>

<table><thead><tr><th width="227">Feature/Tier</th><th>Free</th><th>Plus</th><th>Premium</th></tr></thead><tbody><tr><td>Collections limit per server</td><td>6</td><td>12</td><td>24</td></tr><tr><td>Supported contract types<br>(Mints)</td><td>1/1 only</td><td>1/1 and Editions</td><td>1/1 and Editions</td></tr><tr><td>Supported blockchains <br>(Mints)</td><td>Ethereum, Polygon, Solana</td><td>Ethereum, Polygon, Solana</td><td>Ethereum, Polygon, Solana</td></tr><tr><td>Supported marketplaces <br>(Sales and Listings)</td><td>OpenSea, Magic Eden</td><td>OpenSea, Magic Eden</td><td>OpenSea, Magic Eden</td></tr><tr><td>Update frequency<br>(Mints)</td><td>15 min</td><td>2 min</td><td>Interactive</td></tr><tr><td>Update frequency<br>(Sales and Listings)</td><td>Interactive</td><td>Interactive</td><td>Interactive</td></tr></tbody></table>

## <mark style="color:$primary;">Before Setup.</mark>

To proceed with the collection setup, you need to enable the plugin. To do this, click on the switcher located on the left side of the top bar panel.

<figure><img src="/files/FY5ciDz2PxCarhFA77q7" alt=""><figcaption></figcaption></figure>


# Discord Tracker Rules

## <mark style="color:$primary;">Preparing Channels and Setting Up the Permissions.</mark>

Before starting to create tracking rules, first you need to prepare <mark style="color:yellow;">**#mints**</mark>, <mark style="color:yellow;">**#listings**</mark>, and <mark style="color:yellow;">**#sales**</mark> channels, or you can create a single <mark style="color:yellow;">**#events-tracker**</mark> channel for all event types - it's up to you. You can also name these channels as you wish. The only requirement here is that they must have the [correct channel permissions](/appendix/setting-up-channels-permissions) set up.

## <mark style="color:$primary;">Discord Tracker Rules Activation.</mark>

To start creating the verification rules, you first need to activate them. For this, go to the <mark style="color:$primary;">**Select a Plugin**</mark> page and click on the <mark style="background-color:purple;">`≡ Features`</mark> button on the <mark style="color:blue;">**NFT Tracker**</mark> card.

<figure><img src="/files/YiBeaZpTlqbQQ2uFNxIz" alt=""><figcaption></figcaption></figure>

Now, activate the <mark style="color:$primary;">**Discord NFT Multi Tracker**</mark> feature by clicking on the switcher on the corresponding card, and confirm activation.

<figure><img src="/files/k4fDB3I1awe1njq4skYv" alt=""><figcaption></figcaption></figure>

Now click the <mark style="background-color:purple;">`≡ Configure`</mark> button on this card to visit the page with the list of tracking rules.

<figure><img src="/files/fJQiXxxGyXYe4i6meFL6" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Discord Tracker Rules Setup.</mark>

To add your first rule, click on the <mark style="background-color:$primary;">`+ Add New Rule`</mark> button to call the rule creation form.

<figure><img src="/files/Wi7qXDVn0pIRY4JKJKDX" alt=""><figcaption></figcaption></figure>

Then choose the desired event type from the <mark style="color:$success;">Event Type</mark> dropdown:

<figure><img src="/files/FMY48reHHSE17R49gG5E" alt=""><figcaption></figcaption></figure>

For the detailed instructions on how to set up every particular event type, visit the corresponding page:

{% content-ref url="/pages/sG84c14oOAKcZ2T0SAbW" %}
[Mint Event Type](/plugins/nft-tracker/discord-tracker-rules/mint-event-type)
{% endcontent-ref %}

{% content-ref url="/pages/SOwfeGMo1DT8Fg1cP2cz" %}
[Sale and Listing Event Types](/plugins/nft-tracker/discord-tracker-rules/sale-and-listing-event-types)
{% endcontent-ref %}

## <mark style="color:$primary;">Rule Card Buttons Explanation.</mark>

When done, you will see the rule card. Depending on the rule type, the cards could look different, but they all have a common button panel located in the top-right corner of the card.&#x20;

* To **edit** the rule, use the **Pencil** button. It will call the same form you filled out when creating the rule.
* To **delete** a rule, use the **Trash bin** button.
* The rules with the contract address also have a **Copy** button, located to the right of the contract address in the <mark style="color:$primary;">**Contract**</mark> string. Use this button to copy the contract address.

<figure><img src="/files/TxupGAuTCVrB0GQWkY9g" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Rule Limits Display Explanation.</mark>

After adding at least one rule, a statistic widget will appear on this rule type page, where:

* <mark style="color:$primary;">**Current rules**</mark> - the quantity of the rules of this type (number of cards on this page).
* <mark style="color:$primary;">**Total**</mark> - total rules of all types created (number of all cards on all pages).
* <mark style="color:$primary;">**Limit**</mark> - the maximum quantity of rules of all types you can create on your active tier.

<figure><img src="/files/wxN5fHv79wcQNDH1yOkw" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Rule Type Cards Badges Explanation.</mark>

After adding at least one rule of any type, when moving back to the list of rule types, you will see the badge in the top-left corner of the corresponding rule type card, which represents the number of created rules of this type.

<figure><img src="/files/trrwza475Y1IAi4ffgC9" alt=""><figcaption></figcaption></figure>


# Mint Event Type

This rule type allows tracking both <mark style="color:yellow;">**1/1 NFT collection type**</mark> and <mark style="color:yellow;">**Edition collection type**</mark>**&#x20;**<mark style="color:$danger;">**Mint**</mark> events. The <mark style="color:yellow;">**1/1 NFT collection type**</mark> tracking guaranteed works for supported <mark style="color:$warning;">**EVM**</mark> chains and <mark style="color:$warning;">**Solana**</mark>. The <mark style="color:yellow;">**Edition collection type**</mark> tracking guaranteed works for supported <mark style="color:$warning;">**EVM**</mark> chains, but <mark style="color:red;">didn't test on</mark> <mark style="color:$warning;">**Solana**</mark>.

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Rule Name**</mark> field, enter your desired rule name.
* In the <mark style="color:$primary;">**Blockchain**</mark> dropdown, select the blockchain where your collection contract is deployed.
* In the <mark style="color:$primary;">**Contract**</mark> field, enter the <mark style="color:yellow;">**1/1 collection type**</mark> or <mark style="color:yellow;">**Edition collection type**</mark> [collection contract address](/appendix/getting-collection-contract-address).
* In the <mark style="color:$primary;">**Info Channel**</mark> dropdown, select the prepared <mark style="color:yellow;">**#events-tracker**</mark> channel you wish to send the embeds.

{% hint style="danger" %}
Be especially careful when setting the <mark style="color:$primary;">**Contract**</mark> field for <mark style="color:$warning;">**Solana**</mark> collections! Check this [link](/appendix/getting-collection-contract-address) before starting!
{% endhint %}

## <mark style="color:$primary;">Setting Up the Rule.</mark>

<figure><img src="/files/HtT1ntqojzR7aqORPJ2l" alt=""><figcaption></figcaption></figure>

Depending on [your tier](/plugins/nft-tracker/introduction#capabilities-comparison), to see the first embeds in your prepared <mark style="color:yellow;">**#events-tracker**</mark> channel, you will have to wait up to 15 minutes after the rule is created.

## <mark style="color:$info;">Examples of the embeds.</mark>

The <mark style="color:yellow;">**1/1 NFT collection type**</mark> <mark style="color:$danger;">**Mint**</mark> embed will look like this:

<figure><img src="/files/VRWIRAfJBnBrlYaoI9IZ" alt=""><figcaption></figcaption></figure>

The <mark style="color:yellow;">**Edition collection type**</mark> <mark style="color:$danger;">**Mint**</mark> embed will look like this. The additional <mark style="color:$primary;">**Amount**</mark> field reflects how many editions of the NFT with this ID were minted during the transaction.

<figure><img src="/files/7vLJCheDM326BiTjVq4b" alt=""><figcaption></figcaption></figure>


# Sale and Listing Event Types

This rule type allows tracking both <mark style="color:yellow;">**1/1 NFT collection type**</mark> and <mark style="color:yellow;">**Edition collection type**</mark>**&#x20;**<mark style="color:$danger;">**Listing**</mark> and <mark style="color:$danger;">**Sale**</mark> events.

The <mark style="color:yellow;">**1/1 NFT collection type**</mark> tracking guaranteed works for collections launched on supported <mark style="color:$warning;">**EVM**</mark> chains and listed on <mark style="color:$warning;">**OpenSea**</mark>, and for <mark style="color:$warning;">**Solana**</mark> collections listed on <mark style="color:$warning;">**Magic Eden**</mark>.

The <mark style="color:yellow;">**Edition collection type**</mark> tracking guaranteed works for collections launched on supported <mark style="color:$warning;">**EVM**</mark> chains and listed on <mark style="color:$warning;">**OpenSea**</mark>, but <mark style="color:red;">didn't test on</mark> <mark style="color:$warning;">**Solana**</mark> collections listed on <mark style="color:$warning;">**Magic Eden**</mark>.

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Rule Name**</mark> field, enter your desired rule name.
* In the <mark style="color:$primary;">**Marketplace**</mark> dropdown, select the marketplace where your collection is listed.
* In the <mark style="color:$primary;">**Collection Slug**</mark> or <mark style="color:$primary;">**Collection Symbol**</mark> field (appears only after choosing the <mark style="color:$primary;">**Marketplace**</mark>), enter the [collection slug/symbol](/appendix/getting-collection-slug-symbol).
* In the <mark style="color:$primary;">**Info Channel**</mark> dropdown, select the prepared <mark style="color:yellow;">**#events-tracker**</mark> channel you wish to send the embeds.

{% hint style="danger" %}
Be especially careful when setting the <mark style="color:$primary;">**Contract**</mark> field for <mark style="color:$warning;">**Solana**</mark> collections! Check this [link](/appendix/getting-collection-contract-address) before starting!
{% endhint %}

## <mark style="color:$primary;">Setting Up the Rule.</mark>

Both <mark style="color:$danger;">**Listing**</mark> and sale events have the same rule creation form, so let's take the listing event type as the example.

<figure><img src="/files/6BbJ7sNS5gkMEigVSkJi" alt=""><figcaption></figcaption></figure>

The first embeds will appear in your prepared <mark style="color:yellow;">**#events-tracker**</mark> channel immediately after the listing or sale happens.

## <mark style="color:$info;">Examples of the embeds.</mark>

The <mark style="color:$danger;">**Listing**</mark> embed will look like this:

<figure><img src="/files/Jw5FOHm99PGhSp8Y4fJr" alt=""><figcaption></figcaption></figure>

The <mark style="color:$danger;">**Sale**</mark> embed will look like this:

<figure><img src="/files/kOLDfhNw0wpLUJjblT0b" alt=""><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:$danger;">**Note:**</mark> An alternative display of prices in dollars is only available for collections listed on <mark style="color:$warning;">**OpenSea**</mark>.
{% endhint %}


# NFT Stats

{% content-ref url="/pages/Wy8oND8zbOhUBMzJlEzX" %}
[Introduction](/plugins/nft-stats/introduction)
{% endcontent-ref %}

{% content-ref url="/pages/TKjBdrWdCUjHnh5n27Ot" %}
[Getting Collection Slug/Symbol](/appendix/getting-collection-slug-symbol)
{% endcontent-ref %}

{% content-ref url="/pages/csZRUFz6HNkV2czwJwcp" %}
[Adding New Collection with Rarible](/plugins/nft-stats/adding-new-collection-with-rarible)
{% endcontent-ref %}

{% content-ref url="/pages/MRxg0iDfECn2qL4tugeS" %}
[Updating Collection Data](/plugins/nft-stats/updating-collection-data)
{% endcontent-ref %}

{% content-ref url="/pages/OvTPBerqcSyyX8QeKSX1" %}
[Removing Collections](/plugins/nft-stats/removing-collections)
{% endcontent-ref %}

{% content-ref url="/pages/Dc1Po8tgdih2SrUmLnkj" %}
[Rich Stats Widget](/plugins/nft-stats/rich-stats-widget)
{% endcontent-ref %}


# Introduction

## <mark style="color:$primary;">Overview.</mark>&#x20;

<mark style="color:blue;">**NFT Stats**</mark> is a plugin that provides your **Discord** server with various types of statistics for your NFT Collection in two different ways.

## <mark style="color:$primary;">Sidebar Stats.</mark>

The <mark style="color:blue;">**NFT Stats**</mark> plugin allows you to create categories with sets of voice channels in your **Discord** server's sidebar. This type of statistics shows not only your collection data from the chosen marketplace, but also includes your custom data, such as mint price and total collection supply.

It is perfect for the minting events when you want to show your community members all the actual information about your NFT collection, like minting progress, floor and mint price, unique holders quantity, and secondary market activity.

## <mark style="color:$primary;">Rich Stats.</mark>

The <mark style="color:blue;">**NFT Stats**</mark> plugin can also create an embedded message with a widget that contains only marketplace default data (no custom info about mint price or total collection supply), but represented in extended form, including 1-day, 7-day, and 30-day summaries, which can be updated manually by any user at any time by pressing the <mark style="color:purple;">**Refresh Stats**</mark> button.

<figure><img src="/files/vKdgfy9vNgLc6YpdU0IG" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Capabilities Comparison.</mark>

<table><thead><tr><th width="227">Feature/Tier</th><th>Free</th><th>Plus</th><th>Premium</th></tr></thead><tbody><tr><td>Collections limit per server</td><td>2</td><td>4</td><td>8</td></tr><tr><td>Supported marketplaces</td><td>OpenSea, Magic Eden, LooksRare</td><td>OpenSea, Magic Eden, LooksRare</td><td>OpenSea, Magic Eden, LooksRare</td></tr><tr><td>Supported blockchains</td><td>Ethereum, Polygon, Solana</td><td>Ethereum, Polygon, Solana</td><td>Ethereum, Polygon, Solana</td></tr><tr><td>Supported contract types</td><td>Only Collectibles</td><td>Collectibles and Editions</td><td>Collectibles and Editions</td></tr><tr><td>Auto-update frequency</td><td>24h</td><td>12h</td><td>4h</td></tr><tr><td>Manual update frequency</td><td>1 min</td><td>1 min</td><td>1 min</td></tr><tr><td>Rich Stats Widget</td><td>Available</td><td>Available</td><td>Available</td></tr></tbody></table>

## <mark style="color:$primary;">Before Setup.</mark>

To proceed with the collection setup, you need to enable the plugin. To do this, click on the switcher located on the left side of the top bar panel.

<figure><img src="/files/IOEJDFBW91y14Gd1fcaJ" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Available Commands.</mark>

`/set-collection-stats` Set up Collection Stats Channels.\
`/remove-collection-stats` Remove Stats Channels & stop updates.\
`/refresh-collection-stats` Refresh Collection Stats Channels.\
`/safe-remove-all-stats` Remove all NFT previously created stats channels & stop updates safely.\
`/get-rich-collection-stats` Get Rich Collection Stats.\
`/refresh-metadata` Refresh Collection Metadata.

Use `/help` command to see this list in Discord.

<figure><img src="/files/MyNIImg0cb31hXlNItZU" alt=""><figcaption></figcaption></figure>


# Adding New Collection with Rarible

## <mark style="color:$primary;">Adding Collection via Dashboard.</mark>

#### <mark style="color:purple;">**Action 0.**</mark>

Prepare the [Collection Slug](/appendix/getting-collection-slug-symbol) for the desired marketplace, then come back here.

#### <mark style="color:purple;">**Action 1.**</mark>

Click on the <mark style="color:purple;">**+ Add Collection**</mark> button and in the appeared form select the desired marketplace from the <mark style="color:$primary;">**Marketplace**</mark> drop-down menu. Some unnecessary fields can disappear depending on your choice.

#### <mark style="color:purple;">**Action 2.**</mark>

In the <mark style="color:$primary;">**Collection Slug**</mark> field, paste the <mark style="color:$success;">Collection Slug</mark> you've prepared on <mark style="color:purple;">**Action 0**</mark>. For <mark style="color:$warning;">**Rarible**</mark> collections, the real collection slug is not required, and for <mark style="color:$warning;">**LooksRare**</mark> collections, it doesn't even exist. However, we need something to use as the name of your collection on the collection card and in the Discord stats category title. So you can type the name you want for both, or for <mark style="color:$warning;">**Rarible**</mark>, also use the real collection slug.

#### <mark style="color:purple;">**Action 3.**</mark>

Fill the <mark style="color:$primary;">**Collection Supply**</mark> and <mark style="color:$primary;">**Mint Price**</mark> fields with the desired numbers. You can change these values at any time if needed.

#### <mark style="color:purple;">**Action 4.**</mark>

Select the correct currency in the <mark style="color:$primary;">**Mint Token**</mark> field and the network in the <mark style="color:$primary;">**Blockchain**</mark> field.

<div><figure><img src="/files/pKCShdnE2hh1HnDbgJZC" alt=""><figcaption><p>OpenSea collection setup form</p></figcaption></figure> <figure><img src="/files/yra1LUoGR0mzMW7tecuy" alt=""><figcaption><p>Magic Eden collection setup form</p></figcaption></figure></div>

{% hint style="danger" %} <mark style="color:$danger;">**Important!**</mark> Be attentive - don't mess up the currency and the blockchain! If, for the <mark style="color:$warning;">**Polygon**</mark> collection, you set, for example, <mark style="color:$success;">ETH</mark> as the <mark style="color:$primary;">**Mint Token**</mark> or <mark style="color:$success;">Ethereum</mark> as the <mark style="color:$primary;">**Blockchain**</mark>, it won't work!
{% endhint %}

#### <mark style="color:purple;">**Action 5.**</mark>

On <mark style="color:$warning;">**Rarible**</mark>, some extra fields need to be filled. The first one is the <mark style="color:$primary;">**Contract**</mark> address of your collection, and the second one is the <mark style="color:$primary;">**Display Currency**</mark> - set it to the same as the <mark style="color:$primary;">**Mint Token**</mark>.

On <mark style="color:$warning;">**LooksRare**</mark>, there is only one extra field that needs to be filled - the <mark style="color:$primary;">**Contract**</mark> address of your collection, which can be easily obtained on this marketplace in the same way as the [collection slug](/appendix/getting-collection-slug-symbol) on others.

<div><figure><img src="/files/TWLiO8xJfe9WhaUDclwu" alt=""><figcaption><p>Rarible collection setup form</p></figcaption></figure> <figure><img src="/files/RMM3SXmnxWl14fNsKXEU" alt=""><figcaption><p>LooksRare collection setup form</p></figcaption></figure></div>

#### <mark style="color:purple;">**Action 6.**</mark>

Click on the <mark style="color:$primary;">**Setup Collection**</mark> button, and that's it! You can now see your collection, added to the Dashboard.

<figure><img src="/files/VNH5wRU5xp1cbo9xkosZ" alt=""><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:$danger;">**Note:**</mark> You can add up to 2 collections on the <mark style="color:green;">**Free**</mark> tier, up to 4 collections on the <mark style="color:orange;">**Plus**</mark> tier, and up to 8 on the <mark style="color:red;">**Premium**</mark>.
{% endhint %}

## <mark style="color:$primary;">Adding Collection via Discord Command.</mark>

As an alternative to the Dashboard processing, you can also use the **Discord** command to start the setup process right in **Discord**. For this, go to the <mark style="color:purple;">**Bocto**</mark>**&#x20;**<mark style="color:yellow;">**#hub**</mark> channel (or any other - it doesn't matter) and run this command:  `/set-collection-stats`

The process here is absolutely identical to that in Dashboard - just select the appropriate items in drop-down menus and fill in the data in text fields.

<figure><img src="/files/g5BtZ1M9biJNcIAefqp3" alt=""><figcaption></figcaption></figure>

When you fill in all the obligatory fields, access to the extra fields will be granted. Ignore these fields for <mark style="color:$warning;">**OpenSea**</mark> and <mark style="color:$warning;">**Magic Eden**</mark> collections and fill them only for the collections on <mark style="color:$warning;">**Rarible**</mark> and <mark style="color:$warning;">**LooksRare**</mark>.

<figure><img src="/files/2WJPWKVZbFdYORmBVh2F" alt=""><figcaption><p>Only fill the <em>contract</em> and <em>currency</em> fields for corresponding marketplaces!</p></figcaption></figure>

### <mark style="color:purple;">**Update Frequency.**</mark>

On paid tiers, you will also get access to the <mark style="color:$primary;">**Update Frequency**</mark> setup option via **Discord** command.

<figure><img src="/files/4UoN9F17K5KYcVnqV3zg" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/oUnjNiwjJJmOp9yeQvDA" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Collection Stats channels in the Discord sidebar.</mark>

Regardless of which setup type you choose, once it's complete, you'll also see a collection category with voice channels in your **Discord**:

<figure><img src="/files/TpkZxJAehyk2L2dZaqIH" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">What can you do with the category and the channels?</mark>

* You can rename the category and change its position.
* You can change the channel positions inside the category.

### <mark style="color:purple;">What can't you do with the category and the channels?</mark>

* You can not rename the channels as long as they will be renamed back anyway during the next scheduled update.
* You can not delete the channels as long as they will be recreated anyway during the next scheduled update.


# Adding New Collection

## <mark style="color:$primary;">Adding Collection via Dashboard.</mark>

#### <mark style="color:purple;">**Action 0.**</mark>

Prepare the [Collection Slug](/appendix/getting-collection-slug-symbol) for the desired marketplace, then come back here.

#### <mark style="color:purple;">**Action 1.**</mark>

Click on the <mark style="color:purple;">**+ Add Collection**</mark> button and in the appeared form select the desired marketplace from the <mark style="color:$primary;">**Marketplace**</mark> drop-down menu. Some unnecessary fields can disappear depending on your choice.

#### <mark style="color:purple;">**Action 2.**</mark>

In the <mark style="color:$primary;">**Collection Slug**</mark> field, paste the <mark style="color:$success;">Collection Slug</mark> you've prepared on <mark style="color:purple;">**Action 0**</mark>. For <mark style="color:$warning;">**LooksRare**</mark> collections, the collection slug doesn't exist. However, we need something to use as the name of your collection on the collection card and in the Discord stats category title. So you can type the name you want.

#### <mark style="color:purple;">**Action 3.**</mark>

Fill the <mark style="color:$primary;">**Collection Supply**</mark> and <mark style="color:$primary;">**Mint Price**</mark> fields with the desired numbers. You can change these values at any time if needed.

#### <mark style="color:purple;">**Action 4.**</mark>

Select the correct currency in the <mark style="color:$primary;">**Mint Token**</mark> field and the network in the <mark style="color:$primary;">**Blockchain**</mark> field.

<div><figure><img src="/files/pKCShdnE2hh1HnDbgJZC" alt=""><figcaption><p>OpenSea collection setup form</p></figcaption></figure> <figure><img src="/files/yra1LUoGR0mzMW7tecuy" alt=""><figcaption><p>Magic Eden collection setup form</p></figcaption></figure></div>

{% hint style="danger" %} <mark style="color:$danger;">**Important!**</mark> Be attentive - don't mess up the currency and the blockchain! If, for the <mark style="color:$warning;">**Polygon**</mark> collection, you set, for example, <mark style="color:$success;">ETH</mark> as the <mark style="color:$primary;">**Mint Token**</mark> or <mark style="color:$success;">Ethereum</mark> as the <mark style="color:$primary;">**Blockchain**</mark>, it won't work!
{% endhint %}

#### <mark style="color:purple;">**Action 5.**</mark>

On <mark style="color:$warning;">**LooksRare**</mark>, there is one extra field that needs to be filled - the <mark style="color:$primary;">**Contract**</mark> address of your collection, which can be easily obtained on this marketplace in the same way as the [collection slug](/appendix/getting-collection-slug-symbol) on others.

<figure><img src="/files/RMM3SXmnxWl14fNsKXEU" alt=""><figcaption><p>LooksRare collection setup form</p></figcaption></figure>

#### <mark style="color:purple;">**Action 6.**</mark>

Click on the <mark style="color:$primary;">**Setup Collection**</mark> button, and that's it! You can now see your collection, added to the Dashboard.

<figure><img src="/files/VNH5wRU5xp1cbo9xkosZ" alt=""><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:$danger;">**Note:**</mark> You can add up to 2 collections on the <mark style="color:green;">**Free**</mark> tier, up to 4 collections on the <mark style="color:orange;">**Plus**</mark> tier, and up to 8 on the <mark style="color:red;">**Premium**</mark>.
{% endhint %}

## <mark style="color:$primary;">Adding Collection via Discord Command.</mark>

As an alternative to the Dashboard processing, you can also use the **Discord** command to start the setup process right in **Discord**. For this, go to the <mark style="color:purple;">**Bocto**</mark>**&#x20;**<mark style="color:yellow;">**#hub**</mark> channel (or any other - it doesn't matter) and run this command:  `/set-collection-stats`

The process here is absolutely identical to that in Dashboard - just select the appropriate items in drop-down menus and fill in the data in text fields.

<figure><img src="/files/g5BtZ1M9biJNcIAefqp3" alt=""><figcaption></figcaption></figure>

When you fill in all the obligatory fields, access to the extra fields will be granted. Ignore these fields for <mark style="color:$warning;">**OpenSea**</mark> and <mark style="color:$warning;">**Magic Eden**</mark> collections and fill them only for the collections on <mark style="color:$warning;">**LooksRare**</mark>.

<figure><img src="/files/2WJPWKVZbFdYORmBVh2F" alt=""><figcaption><p>Only fill the <em>contract</em> and <em>currency</em> fields for corresponding marketplaces!</p></figcaption></figure>

### <mark style="color:purple;">**Update Frequency.**</mark>

On paid tiers, you will also get access to the <mark style="color:$primary;">**Update Frequency**</mark> setup option via **Discord** command.

<figure><img src="/files/4UoN9F17K5KYcVnqV3zg" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/oUnjNiwjJJmOp9yeQvDA" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Collection Stats channels in the Discord sidebar.</mark>

Regardless of which setup type you choose, once it's complete, you'll also see a collection category with voice channels in your **Discord**:

<figure><img src="/files/TpkZxJAehyk2L2dZaqIH" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">What can you do with the category and the channels?</mark>

* You can rename the category and change its position.
* You can change the channel positions inside the category.

### <mark style="color:purple;">What can't you do with the category and the channels?</mark>

* You can not rename the channels as long as they will be renamed back anyway during the next scheduled update.
* You can not delete the channels as long as they will be recreated anyway during the next scheduled update.


# Updating Collection Data

## <mark style="color:$primary;">Editing Collection Information.</mark>

If something changed in your mint strategy or price policy, you can always update the data shown in the **Discord&#x20;**<mark style="color:$primary;">**Stats**</mark> voice channels generated by the <mark style="color:blue;">**NFT Stats**</mark> plugin. For this, visit the <mark style="color:blue;">**NFT Stats**</mark> plugin page in Dashboard, press the <mark style="color:purple;">**Edit**</mark> button on the collection card, and change the values in the available fields.

<figure><img src="/files/oqjkH1UFCRn8gdCS1qtu" alt=""><figcaption></figcaption></figure>

Some fields, like <mark style="color:$primary;">**Marketplace**</mark>, <mark style="color:$primary;">**Collection Slug**</mark>, and <mark style="color:$primary;">**Contract**</mark>, can't be changed. When done, press the <mark style="color:purple;">**Update Collection**</mark> button and check the Stats voice channels to ensure that the info has been updated.

{% hint style="info" %} <mark style="color:$danger;">**Note:**</mark> You can only edit the collection info via Dashboard (we have no special **Discord** command for this).&#x20;
{% endhint %}

## <mark style="color:$primary;">Refreshing Collection Statistics.</mark>

Depending on your tier, the collection statistics in Stats voice channels update automatically every 24, 12, or 6 hours, but you can update them manually as well. For this:

* Visit the <mark style="color:blue;">**NFT Stats**</mark> plugin page in Dashboard, and press the <mark style="color:purple;">**Refresh**</mark> button on the desired collection card.
* Use `/refresh-collection-stats` command in **Discord** in the <mark style="color:purple;">**Bocto**</mark>**&#x20;**<mark style="color:yellow;">**#hub**</mark> channel (or any other), enter the [collection slug](/appendix/getting-collection-slug-symbol) and select the marketplace so that the bot can identify the collection whose statistics you want to update.

<figure><img src="/files/HVLUlGN0aMBRmSXxKd93" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Refreshing Collection Metadata.</mark>

You can also trigger the refresh metadata method for your collection on the marketplace where it is listed. For this use `/refresh-metadata` command in **Discord** in the <mark style="color:purple;">**Bocto**</mark>**&#x20;**<mark style="color:yellow;">**#hub**</mark> channel (or any other), enter the [collection slug](/appendix/getting-collection-slug-symbol) and select the marketplace so that the bot can identify the collection whose metadata you want to update.

Unlike `/refresh-collection-stats` the `/refresh-metadata` command has 3 extra options:

* token\_id - if you only want to refresh a specific token metadata.
* token\_range - if you want to refresh metadata of a specific token range.
* refresh\_last\_20 - to refresh metadata for the last 20 tokens.

<figure><img src="/files/uWxGGx97IYTzBqAYO1Mo" alt=""><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:$danger;">**Note:**</mark> You can only refresh your collection metadata by using this **Discord** command (we have no special option for this in Dashboard).
{% endhint %}

{% hint style="info" %} <mark style="color:$danger;">**Note:**</mark> This feature currently works only for collections listed on <mark style="color:$warning;">**OpenSea**</mark>!
{% endhint %}


# Removing Collections

If, for some reason, you decided to remove one or all your collections, you can do it easily in a few clicks without the necessity of manually removing the <mark style="color:$primary;">**Stats**</mark> category and <mark style="color:$primary;">**Stats**</mark> voice channels. **Bocto** provides you with two ways to do it.

## <mark style="color:$primary;">Removing collections one by one.</mark>

### <mark style="color:purple;">Removing via Dashboard.</mark>

The easiest way is to visit the NFT Stats plugin page in Dashboard, press the <mark style="color:purple;">**Remove**</mark> button on the collection card. It will remove the card itself, the collection's data from our database, and the collection category with all the channels inside it automatically.

### <mark style="color:purple;">Removing via Discord command.</mark>

The second way is to use `/remove-collection-stats` command in **Discord** in the <mark style="color:purple;">**Bocto**</mark>**&#x20;**<mark style="color:yellow;">**#hub**</mark> channel (or any other), enter the [collection slug](/appendix/getting-collection-slug-symbol) and select the marketplace so that the bot can identify the collection you want to remove.

<figure><img src="/files/SCO3Y9vLMstjgzQNixdJ" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Batch safe removing.</mark>

If you don't want to mess with one-by-one removal, you can use `/safe-remove-all-stats` command in **Discord** in the <mark style="color:purple;">**Bocto**</mark>**&#x20;**<mark style="color:yellow;">**#hub**</mark> channel (or any other), and Bocto will do everything safely and automatically. All the collection cards in Dashboard, the collection's data in our database, and the collection categories with all the channels inside them will be removed.

<figure><img src="/files/sxqmRusDaOst3zUzxZ1r" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %} <mark style="color:$danger;">**Important!**</mark> This command has no intermediate steps or options, and once it is launched, all the data about your collections <mark style="color:red;">**will be deleted immediately**</mark>! Proceed with caution!
{% endhint %}


# Rich Stats Widget

In addition to categories with sets of <mark style="color:$primary;">**Stats**</mark> voice channels in **Discord** sidebar, <mark style="color:purple;">**Bocto**</mark> can also create an embedded message with a widget that contains only marketplace default data (no custom info about mint price or total collection supply), but represented in extended form, including 1-day, 7-day, and 30-day summaries.

<figure><img src="/files/hXPNIKY5AoG6LGCheyvq" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Set up the Channel and Permissions.</mark>

Prepare the <mark style="color:yellow;">**#rich-stats**</mark> (or name it as you wish) public channel with the [correct channel permissions](/appendix/setting-up-channels-permissions) where you want to set up the widget, then come back here to continue.

## <mark style="color:$primary;">Set up the Rich Stats Widget.</mark>

When you've done with the permissions, in the created channel, run `/get-rich-collection-stats` command, enter the [collection slug](/appendix/getting-collection-slug-symbol), and select the marketplace where it is listed. Currently works for <mark style="color:$warning;">**OpenSea**</mark> only.

<figure><img src="/files/StpEyorGqgAF4OQOiUdm" alt=""><figcaption></figcaption></figure>

The <mark style="color:$primary;">**Rich Stats Widget**</mark> will appear, which can be updated manually by any user at any time by pressing the <mark style="color:purple;">**Refresh Stats**</mark> button.

<figure><img src="/files/MZmVi7xVXCTxANimYGvw" alt=""><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:$danger;">**Note:**</mark> This command does not create any collection cards on the <mark style="color:purple;">**NFT Stats**</mark> plugin page in the Dashboard or any <mark style="color:$primary;">**Stats**</mark> voice channels in your **Discord**!
{% endhint %}

{% hint style="info" %} <mark style="color:$danger;">**Note:**</mark> This feature currently works only for collections listed on <mark style="color:$warning;">**OpenSea**</mark>!
{% endhint %}


# Guard

{% content-ref url="/pages/NPZHuwyCZwm5RdDOxpCy" %}
[Introduction](/plugins/guard/introduction)
{% endcontent-ref %}

{% content-ref url="/pages/1oG5GPRMuiRoXrxcIHTE" %}
[Guard Features](/plugins/guard/guard-features)
{% endcontent-ref %}

{% content-ref url="/pages/m4cFTbxOMGP4Nyb5GQCh" %}
[Guard Features Configuration](/plugins/guard/guard-features-configuration)
{% endcontent-ref %}

{% content-ref url="/pages/pFXz0AZTkYimPyi0EyQ2" %}
[Guard Settings](/plugins/guard/guard-settings)
{% endcontent-ref %}


# Introduction

## <mark style="color:$primary;">Overview.</mark>&#x20;

<mark style="color:blue;">**Guard**</mark> is a plugin that extends your **Discord** server with several simple, original anti-spam features in addition to the default **Discord** functionality, making your server an even safer place.

## <mark style="color:$primary;">Features List.</mark>

### <mark style="color:purple;">Not Matching HyperLinks.</mark>

This feature checks if the text of the link in the user's message corresponds to the actual inserted link and leads to the same website.

### <mark style="color:purple;">Links in Embed Messages.</mark>

This feature checks if the custom embed message contains links and blocks it if any are found.

### <mark style="color:purple;">Users With Transparent PFPs.</mark>

This feature evaluates the user's PFP and blocks the message if the ratio of the transparent and opaque pixels doesn't match the tolerance.

### <mark style="color:purple;">Promotional Text and QR Codes in Images.</mark>

This feature analyzes the images attached to the message using an AI library and blocks the message if the image text is evaluated as spam content or the image contains a QR code.

## <mark style="color:$primary;">Before Setup.</mark>

To proceed with the collection setup, you need to enable the plugin. To do this, click on the switcher located on the left side of the top bar panel.

<figure><img src="/files/xt06uaKOo1a85fdrIjNs" alt=""><figcaption></figcaption></figure>


# Guard Features

## <mark style="color:$primary;">Guard Features Activation.</mark>

To start using the <mark style="color:blue;">**Guard**</mark> features, you first need to activate them. For this, go to the <mark style="color:$primary;">**Select a Plugin**</mark> page and click on the <mark style="background-color:purple;">`≡ Features`</mark> button on the <mark style="color:blue;">**Guard**</mark> card.

<figure><img src="/files/3ZZD4qrR8VN11GuJW7zt" alt=""><figcaption></figcaption></figure>

Now, activate the desired features (we strongly recommend enabling all of them) by clicking on the switcher on the corresponding card, and confirm activation - one feature at a time.

<figure><img src="/files/0Ujg19Z8ZkenYsHITmS0" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Guard Features List.</mark>

For the detailed explanation of how each particular feature works, visit the corresponding page:

{% content-ref url="/pages/0tCMjdX3Bq8ZCTacqmjq" %}
[Not Matching HyperLinks](/plugins/guard/guard-features/not-matching-hyperlinks)
{% endcontent-ref %}

{% content-ref url="/pages/RmOY9KRcOf6TwEwXsXmL" %}
[Links in Embed Messages](/plugins/guard/guard-features/links-in-embed-messages)
{% endcontent-ref %}

{% content-ref url="/pages/aiTFeYDK3L4rqG6ikzeb" %}
[Users With Transparent PFPs](/plugins/guard/guard-features/users-with-transparent-pfps)
{% endcontent-ref %}

{% content-ref url="/pages/cN29qCQnB4otQqNNx9Er" %}
[Promotional Text and QR Codes in Images](/plugins/guard/guard-features/promotional-text-and-qr-codes-in-images)
{% endcontent-ref %}

{% hint style="success" %}

Once you've activated all features, it's time to [set up the Guard Settings](/plugins/guard/guard-settings).
{% endhint %}

## <mark style="color:$primary;">Guard Features Сonfiguration.</mark>

All the <mark style="color:blue;">**Guard**</mark> features, by default, have an optimal configuration, and in general, you should not change them, but if you want to, click the <mark style="background-color:purple;">`≡ Configure`</mark> button on the corresponding card. Read more about the <mark style="color:blue;">**Guard**</mark> features configuration [here](/plugins/guard/guard-features-configuration).


# Not Matching HyperLinks

This feature checks if the text of the link in the user's message matches the actual inserted link and directs to the same website.

## <mark style="color:$primary;">Scam Mechanics.</mark>

If you might know, the links in **Discord** could be exposed like `https://website.com` or non-exposed, i.e., with a URL address (also called a link anchor) hidden behind the text link. This non-exposed type of link can be created with a special **Discord** syntax pattern like this:

&#x20;`[Link text](https://link-anchor.com/target-url)`

Being posted in **Discord** chat, this message will look like this:

<figure><img src="/files/2xHAkBBHlJkPIDbNYqte" alt=""><figcaption></figcaption></figure>

When the link text makes sense, it's okay, because users understand that they are clicking on a text with a hyperlink that can lead them anywhere, and they should be cautious. However, scammers can abuse this **Discord** feature to make the link text look like an exposed link, while hiding the actual link address using this syntax:

&#x20;`[octopeeps.com](https://octopeeps.io)` or  `[www.octopeeps.com](https://octopeeps.io)`

Let's take the first variant (without www):

<figure><img src="/files/JWdPQsOC6i8gDEmlV4HH" alt=""><figcaption></figcaption></figure>

And, being posted in **Discord**, it will look like this:

<figure><img src="/files/5nGejqWCUzzpaTvZU9yc" alt=""><figcaption></figcaption></figure>

You see?! The link text here looks like an absolutely legit website URL, but the link anchor leads to another domain - to <mark style="color:yellow;">**.io**</mark> instead of <mark style="color:yellow;">**.com**</mark>!

A more complex example of this scam message can have this syntax:

`Check the official [octopeeps.com](https://octopeeps.io) website!`

<figure><img src="/files/3U4U6XOMp7b58qnJ6s8a" alt=""><figcaption></figcaption></figure>

Here we see the same picture with a mismatched domain name in the link text and the real URL in the link anchor. However, this time, the message looks even less suspicious because the surrounding text distracts the reader's attention.

## <mark style="color:$primary;">Explanation of the Feature.</mark>

And this is where the <mark style="color:$success;">Not Matching HyperLinks</mark> feature comes into action! It detects if the message contains a text pattern similar to a URL address syntax in the \[square brackets] in link text and checks if it matches the real target URL address, if any, in the following (parentheses), and if it doesn't, blocks the message:

<figure><img src="/files/jLUGilLNxR3fQHNJsdQk" alt=""><figcaption></figcaption></figure>

Depending on your [Guard Settings](/plugins/guard/guard-settings), <mark style="color:purple;">**Bocto**</mark> can also post a detailed alert to the <mark style="color:yellow;">**#alerts**</mark> channel it created during the [setup on the server](/getting-started/setup-on-server):

<figure><img src="/files/TpNqY4AMJlXeXCBvEvgA" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Patterns That This Feature Blocks.</mark>

Currently, the <mark style="color:$success;">Not Matching HyperLinks</mark> feature blocks these patterns:

`[https://octopeeps.com](https://octopeeps.io)`

`[www.octopeeps.com](https://octopeeps.io)`

`[octopeeps.com](https://octopeeps.io)`


# Links in Embed Messages

This feature checks if the custom embed message contains links and blocks it if any are found.

## <mark style="color:$primary;">Scam Mechanics.</mark>

**Discord** offers an option to make posted links look more attractive by adding what are called Embeds. This is when a proper widget appears below the user's message if it contains a link. To enable this feature, you need to turn on the <mark style="color:$success;">Embed Links</mark> permission in the role or channel settings. However, the Embed functionality is also widely used by bots and admins to create vibrant and attractive custom embeds, which can include links.

<figure><img src="/files/j0ZBcB1GO0S9x9FMIB5Z" alt=""><figcaption></figcaption></figure>

The truth is, the scammers can do it as well sometimes! As mentioned above, you need to have special permissions to post such embeds - either you must be a bot or have Administrator permissions on the server and access to the server's API to create webhooks and use them to post such embeds via services like **Discohook**. So technically, this case is hardly reproducible, but still, we have been facing cases on our server where regular users without obligatory permissions found a way to post custom embeds in public channels!

## <mark style="color:$primary;">Explanation of the Feature.</mark>

And this is where the <mark style="color:$success;">Links in Embed Messages</mark> feature comes into action! It detects if the custom embed message contains a link, and if it does, blocks the message.

## <mark style="color:$primary;">The Problem of the Feature Usage.</mark>

This feature would serve as an ideal temporary protection if an admin or bot on your server were hacked and the attacker gained access to post custom embeds using that bot or account. However, **Discord** does not allow bots to block each other, so this feature cannot protect your server from compromised bots.&#x20;

And if we took a compromised admin case, here is a kind of similar situation. The previous feature's default behavior was to block admins' custom embeds containing links just as any other role. This behavior could be changed by manually configuring the bot through the Dashboard for the period when admins post their embeds. This could become quite a good temporary protection, giving the server owner time to react until the attacker kicks <mark style="color:purple;">**Bocto**</mark>.

However, for many server owners, this pipeline was complicated and unclear, so we had to exclude roles with Administrator permissions from the check, and now it is impossible to change it through feature configuration.

Summarizing everything above, we can describe this feature as a "just in case" one, which might never even be triggered.

## <mark style="color:$primary;">We Don't Know If It Is a Bug or a Feature...</mark>

...but, we noticed that while **Discord** automatically deletes links, if any, from default embeds it creates (when you post a regular link to a page with a feature image and a first paragraph containing a link), it retains links in the embeds it generates within the X posts. This is why the <mark style="color:$success;">Links in Embed Messages</mark> feature blocks these posts by default.

This is how the X-autogenerated embed with a link looks when being posted by an authorized user:

<figure><img src="/files/IUmDLVHeCO3yPOIy8RKA" alt=""><figcaption></figcaption></figure>

This is a trusted link to the trusted X post that contains the trusted link to the space hosted by our friends.

But if someone else posts the same link, the message will be blocked if the <mark style="color:$success;">Links in Embed Messages</mark> feature configuration settings are set by default:

<figure><img src="/files/VIEQc9jchou3GX0eYYhp" alt=""><figcaption></figcaption></figure>

Depending on your [Guard Settings](/plugins/guard/guard-settings), <mark style="color:purple;">**Bocto**</mark> can also post a detailed alert to the <mark style="color:yellow;">**#alerts**</mark> channel it created during the [setup on the server](/getting-started/setup-on-server):

<figure><img src="/files/lxiysF6UGiPOOtB6FIcX" alt=""><figcaption></figcaption></figure>

Currently, we noticed this behavior only for X links. So if you really want to prevent anyone but administrators from posting X links, no action is needed, but if you want to allow posting X links for certain roles in certain channels, you need to change this [feature configuration](/plugins/guard/guard-features-configuration).


# Users With Transparent PFPs

This feature evaluates the user's PFP and blocks the message if the ratio of the transparent and opaque pixels doesn't matchs the tolerance.

## <mark style="color:$primary;">Scam Mechanics.</mark>

Before we start, just look at this message by **Mr. Diamond**, who is the server admin:

<figure><img src="/files/EgKZQ56IEjuV39lksvs6" alt=""><figcaption></figcaption></figure>

Did you notice anything that looks suspicious to you in this message? Probably not. <mark style="color:red;">And this is a problem!</mark> Because there are actually two messages from two different users!

In **Discord,** users can set up transparent PNG images for avatars, as well as use emojis instead of letters in their display names. And this is how the user profile can look as a result:

<figure><img src="/files/16OL2uGwVpEq1TNipfTL" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/QjWG0iEV3f3Mv0NBb8YE" alt=""><figcaption></figcaption></figure>

But if we inspect the source code via the developer console in the browser, we'll see that there is indeed another one PFP here - that very transparent PNG our Mr. Smart Guy set earlier for his account!

<figure><img src="/files/GWUycNF2QD6ubmA3ZCKs" alt=""><figcaption></figcaption></figure>

It is still a very popular scammer's trick! People in **Discord** are, in most cases, careless and relaxed, and can easily lower their guard and mistake such a message for a message from an administrator or a member of the project team.

## <mark style="color:$primary;">Explanation of the Feature.</mark>

And this is where the <mark style="color:$success;">Users With Transparent PFPs</mark> feature comes into action! It analyzes the user avatar if its ratio of the transparent and opaque pixels matches the tolerance, and if it doesn't, it blocks the message:

<figure><img src="/files/CP5SuzSUc2gJLXs5RXGo" alt=""><figcaption></figcaption></figure>

Depending on your [Guard Settings](/plugins/guard/guard-settings), <mark style="color:purple;">**Bocto**</mark> can also post a detailed alert to the <mark style="color:yellow;">**#alerts**</mark> channel it created during the [setup on the server](/getting-started/setup-on-server):

<figure><img src="/files/bDWoLw8YfwnFZ7Md1rjb" alt=""><figcaption></figcaption></figure>

Sometimes, scammers even try to set the transparent PNG image with a small, barely visible grey opaque dot to trick the weak filters. However, <mark style="color:purple;">**Bocto**</mark> uses a 40% tolerance barrier to determine and block scam PFPs, while allowing legit PFPs with some amount of transparent pixels.

<div><figure><img src="/files/6cnJOz4jzbb4ftyGW9pr" alt=""><figcaption></figcaption></figure> <figure><img src="/files/zz4ZsM1pnrls4JbsqhEu" alt=""><figcaption></figcaption></figure></div>

## <mark style="color:$primary;">PFP Types That This Feature Blocks.</mark>

Currently, the <mark style="color:$success;">Users With Transparent PFP</mark> feature only reacts to PFP transparency. In the future, we will also add an analysis algorithm for **Discord** themes' colors.


# Promotional Text and QR Codes in Images

This feature analyzes the images attached to the message using a special library and blocks the message if the image text is evaluated as spam content or if the image contains a QR code. It allows you to grant the <mark style="color:$success;">Attach Files</mark> permission in the role or channel settings without fear that users will abuse it.

## <mark style="color:$primary;">Scam Mechanics.</mark>

**Discord** algorithms have become smarter and can detect potential scam content in text more efficiently than ever. However, scammers invent new ways to bypass these algorithms. And one of such ways is to use images with text scam content. Have you ever seen messages like this? Probably, you did.&#x20;

<figure><img src="/files/EmDJ43466gwZsM63vaQj" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Explanation of the Feature.</mark>

And this is where the <mark style="color:$success;">Promotional Text and QR Codes in Images</mark> feature comes into action! It detects if the attached image contains text, analyzes it, if any, if the content looks like spam, and if it does, blocks the message:

<figure><img src="/files/zpUfFBYcryW0LsAPBths" alt=""><figcaption></figcaption></figure>

Depending on your [Guard Settings](/plugins/guard/guard-settings), <mark style="color:purple;">**Bocto**</mark> can also post a detailed alert to the <mark style="color:yellow;">**#alerts**</mark> channel it created during the [setup on the server](/getting-started/setup-on-server):

<figure><img src="/files/JOlUZmWCQJsDPqJK91at" alt=""><figcaption></figcaption></figure>

Moreover, <mark style="color:purple;">**Bocto**</mark> can determine QR codes! For example, this message with the **Astery Jewelry** flyer and QR code on it will be blocked as well if the <mark style="color:$success;">Promotional Text and QR Codes in Images</mark> feature is enabled:

<figure><img src="/files/eBwGLcoN3SK8zYYmUzlg" alt=""><figcaption></figcaption></figure>

Actually, **Astery Jewelry** is absolutely legit - it is our umbrella project that you can visit using this QR code without any concerns. We put it as an example just because we have no other one.

## <mark style="color:$primary;">Image Type That This Feature Blocks.</mark>

Currently, the <mark style="color:$success;">Promotional Text and QR Codes in Images</mark> feature recognizes and blocks images with:

* Text content that can be clearly determined as scam content with money offers and contacts.
* Clearly readable, strictly aligned QR codes.


# Guard Features Configuration

To get access to the global <mark style="color:blue;">**Guard**</mark> features settings, press the `≡ Configure` button on the corresponding feature card on the <mark style="color:$primary;">**Guard**</mark> page:

<figure><img src="/files/uGMBpXpE47A6iavd2fHt" alt=""><figcaption></figcaption></figure>

Actually, the <mark style="color:blue;">**Guard**</mark> features have the same configuration options and, by default, provide checks for all roles (excluding bots and users with Owner and Administrator rights) in all channels. But you can configure each feature separately so that it works only for certain roles and only in certain channels.

For example, the default configuration for the <mark style="color:$success;">Not Matching HyperLinks</mark> feature below denies posting messages with mismatching links in all channels and to all roles but Bots, Server Owners, and Administrators. But if, for some reason, you want to allow posting these kinds of links for some roles or in some channels, you can set it manually:

<figure><img src="/files/7fJq0tiiwpsVnOVJk6KF" alt=""><figcaption></figcaption></figure>


# Guard Settings

To get access to the global <mark style="color:blue;">**Guard**</mark> settings, press the `⚙` button on the <mark style="color:$primary;">**Select a Plugin**</mark> page:

<figure><img src="/files/AEe8VJkdOVFYROoN86ch" alt=""><figcaption></figcaption></figure>

Here, you can set what <mark style="color:purple;">**Bocto**</mark> should do if one of the <mark style="color:blue;">**Guard**</mark> features is triggered:

<figure><img src="/files/yFlJ0Kirk9nWJXV2lpvZ" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Block messages quietly.</mark>

If this option is disabled, <mark style="color:purple;">**Bocto**</mark> will block the message considered spam and display the corresponding spam type <mark style="color:$danger;">warning message</mark> visible to everyone in the channel:

<figure><img src="/files/M3jbRuoU5Nxx03vTbKaN" alt=""><figcaption></figcaption></figure>

If this option is enabled, <mark style="color:purple;">**Bocto**</mark> will block the message considered spam, but won't reveal itself by displaying a <mark style="color:$danger;">warning message</mark>.

## <mark style="color:$primary;">Send logs to admins.</mark>

If this option is enabled, in addition to the <mark style="color:$danger;">warning message</mark> posted in the channel where the spam message is posted, <mark style="color:purple;">**Bocto**</mark> will also post a detailed alert to the <mark style="color:yellow;">**#alerts**</mark> channel it created during the [setup on the server](/getting-started/setup-on-server). This option is especially handy if you have enabled the <mark style="color:$success;">Block messages quietly</mark> option.

<figure><img src="/files/TpNqY4AMJlXeXCBvEvgA" alt=""><figcaption></figcaption></figure>


# Mini Games


# Introduction

## <mark style="color:$primary;">Overview.</mark>&#x20;

<mark style="color:blue;">**Mini Games**</mark> is a plugin that provides your **Discord** server with simple games, which can increase your community engagement.

## <mark style="color:$primary;">Word Streak.</mark>

This feature enables running Discord challenges where users post a selected word, such as GM, daily, for a specific period, and winners are automatically chosen when the challenge ends.

## <mark style="color:$primary;">Capabilities Comparison.</mark>

<table><thead><tr><th width="227">Option/Tier</th><th>Free</th><th>Plus</th><th>Premium</th></tr></thead><tbody><tr><td>Simultaneous Word Streak games available</td><td>3</td><td>6</td><td>12</td></tr></tbody></table>

## <mark style="color:$primary;">Before Setup.</mark>

To proceed with the collection setup, you need to enable the plugin. To do this, click on the switcher located on the left side of the top bar panel.

<figure><img src="/files/m2tJL6EPUzofEawwkwnx" alt=""><figcaption></figcaption></figure>


# Word Streak

This feature enables running Discord challenges where users post a selected word, such as GM, daily, for a specific period, and winners are automatically chosen when the challenge ends.

## <mark style="color:$primary;">Preparing Channels and Setting Up the Permissions.</mark>

Before starting to create the word streaks, first, you need to prepare the public channels where you want to run the streaks and the channel where you want to post their results by setting up the [correct channel permissions](/appendix/setting-up-channels-permissions).

## <mark style="color:$primary;">Word Streak Activation.</mark>

To start creating the game rules, you first need to activate them. For this, go to the <mark style="color:$primary;">**Select a Plugin**</mark> page and click on the <mark style="background-color:purple;">`≡ Features`</mark> button on the <mark style="color:blue;">**Mini Games**</mark> card.

<figure><img src="/files/ZtOIConjbnnr3e3b0p46" alt=""><figcaption></figcaption></figure>

Now, activate the <mark style="color:$primary;">**Word Streak**</mark> by clicking on the switcher on the corresponding card, and confirm activation.

<figure><img src="/files/svdm3c5E01lFRNYSz0G9" alt=""><figcaption></figcaption></figure>

Now click the <mark style="background-color:purple;">`≡ Configure`</mark> button on this card to visit the page with the list of Word Streaks.

<figure><img src="/files/U8ceI4lTs18hkAFkCPjw" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Word Streak Setup.</mark>

To add your first rule, click on the <mark style="background-color:$primary;">`+ Add New Game`</mark> button to call the rule creation form.

<figure><img src="/files/HQB3NxCrfvNVD8nAspib" alt=""><figcaption></figcaption></figure>

For the detailed instructions on how to fill the <mark style="color:$primary;">**Word Streak**</mark> creation form, visit the corresponding page:

{% content-ref url="/pages/wUkx0aqp81fWtTU6soZw" %}
[Streak Creation Form](/plugins/mini-games/word-streak/streak-creation-form)
{% endcontent-ref %}

## <mark style="color:$primary;">Game Card Buttons Explanation.</mark>

When done, you will see the game card with the button panel in the top-right corner.

* To create a **duplicate** of the streak, use the **Copy** button.
* To **edit** the rule, use the **Pencil** button (streaks with <mark style="color:red;background-color:red;">`Ended`</mark> status can't be edited).
* To **delete** a rule, use the **Trash bin** button.

<figure><img src="/files/PktnZDbpVRiaA7d8GywL" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Game Limits Display Explanation.</mark>

After adding at least one rule, a statistic widget will appear on this rule type page, where:

* <mark style="color:$primary;">**Current Games**</mark> - the number of created streaks (number of cards on this page).
* <mark style="color:$primary;">**Total**</mark> - for <mark style="color:blue;">**Mini Games**</mark> is the same as <mark style="color:$primary;">**Current Games**</mark>.
* <mark style="color:$primary;">**Limit**</mark> - the maximum number of streaks you can create on your active tier.

<figure><img src="/files/qYSk7EhRVfrYvwPIkJkH" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Verification Logs Explanation.</mark>

After the first game event takes place, the <mark style="color:$primary;">**Games Logs**</mark> table will appear below the game types section with the following data:

* <mark style="color:$primary;">**Game Name**</mark> - the name of the game as it was given during the [creation process](/plugins/mini-games/word-streak/streak-creation-form).
* <mark style="color:$primary;">**Type**</mark> - the type of the game.
* <mark style="color:$primary;">**Status**</mark> - the status of the game if it is time-framed.
* <mark style="color:$primary;">**Start Date**</mark> - the date and time when the game has or is going to start.
* <mark style="color:$primary;">**End Date**</mark> - the date and time when the game has or is going to end.
* <mark style="color:$primary;">**Participants**</mark> - the list of all users who took part in this game.
* <mark style="color:$primary;">**Prizes**</mark> - the list of prizes as they were named during the [creation process](/plugins/mini-games/word-streak/streak-creation-form).

<figure><img src="/files/jNDToSz1MYTKe1n8czWv" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Available Commands.</mark>

You can find all available commands with a detailed explanation on this page:

{% content-ref url="/pages/jLfJH4jK1mOX4LRZfFcR" %}
[Commands and Widgets](/plugins/mini-games/word-streak/commands-and-widgets)
{% endcontent-ref %}


# Streak Creation Form

## <mark style="color:$primary;">Explanation of the Fields.</mark>

* In the <mark style="color:$primary;">**Game Name**</mark> field, enter your desired streak name.
* In the <mark style="color:$primary;">**Start Date**</mark> dropdown, select the day and time you want to start the streak.
* In the <mark style="color:$primary;">**End Date**</mark> dropdown, select the day and time you want to finish the streak.
* In the <mark style="color:$primary;">**Target words**</mark> field, type the word or words you want <mark style="color:purple;">**Bocto**</mark> to react to.
* In the <mark style="color:$primary;">**Prizes**</mark> field, type prize names.
* In the <mark style="color:$primary;">**Info Channel**</mark> dropdown, select the prepared channel with the [correct channel permissions](/appendix/setting-up-channels-permissions) where you wish <mark style="color:purple;">**Bocto**</mark> to send announcements when the streak is created and results when the streak is ended.

## <mark style="color:$primary;">Setting Up the Streak Conditions. Required Fields.</mark>

<figure><img src="/files/Boahktus1tz9WTNbIQjG" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">The End Date Setup Recommendation.</mark>

Since <mark style="color:blue;">**Word Streak**</mark> counts only one mention of the target word(s) per day per user, we recommend setting the game duration to more than 1 day (1 week or more is ideal). However, to test how it works, you can set it to even 1 minute.

### <mark style="color:purple;">The Target Word Field Tricks.</mark>

<figure><img src="/files/LOa1DdR6edivKpDO5tDt" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
More than one word (*<mark style="color:$success;">e.g., gm, good morning</mark>*) in the <mark style="color:$primary;">**Target words**</mark> field is acceptable. Separate words with commas if you wish to add more than one target word.
{% endhint %}

{% hint style="success" %}
Don't care about the case - Bocto will count the word typed as *<mark style="color:$success;">gm</mark>* or *<mark style="color:$success;">Gm</mark>* or *<mark style="color:$success;">GM</mark>* as the same word.
{% endhint %}

{% hint style="success" %}
Emojis are acceptable - use any regular emojis (like ☕,💜,🔥,💍or any other) as one word or separated by commas if you want to make the streak more specific or fun.
{% endhint %}

{% hint style="success" %}
Running several word streaks simultaneously is acceptable. Even duplicates of streaks with the same target word running simultaneously are acceptable! We have no idea why you need to use it, but if you will - it works!
{% endhint %}

{% hint style="danger" %}
You won't be able to change the target word after the word streak is created!
{% endhint %}

### <mark style="color:purple;">The Prizes Setup Recommendation.</mark>

You can set up to three prizes for the game, but only the first-place prize is required. The prizes for 2nd and 3rd place are optional, and you can keep these fields blank.

## <mark style="color:$primary;">Setting Up the Streak Conditions. Optional Fields.</mark>

By default, the target word(s) are triggered by all roles in all public channels (and also private channels, where <mark style="color:purple;">**Bocto**</mark> was added manually).

<figure><img src="/files/UTQ9UAVyBEejEdoTcHbG" alt=""><figcaption></figcaption></figure>

However, you can configure it so that it reacts only for certain roles and/or only in certain channels.

<figure><img src="/files/wFyGaKrAjbIUTCel1o8K" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
The server owner and users with Administrator permissions will be excluded from exceptions, meaning <mark style="color:purple;">**Bocto**</mark> will always respond to their messages containing the target word(s).
{% endhint %}


# Game Timeline

## <mark style="color:$primary;">When the Game is Created.</mark>

After the word streak is created, a light-green embedded announcement message with the streak details will be posted in the **Discord** channel you chose as the <mark style="color:$primary;">**Info Channel**</mark>.

<figure><img src="/files/WbTYiKIKW4JvEx253U04" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">When the Game is Started.</mark>

After the word streak started, every day a user posts a message containing the target word(s), <mark style="color:purple;">**Bocto**</mark> will reply with a random phrase and add a point to the user's score.

<figure><img src="/files/3oRYJEt0X7MGn2Iv1Tzl" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Only the one (the first one) mention of a target word per day counts. If several target words are added in the [streak creation form](/plugins/mini-games/word-streak/streak-creation-form), only the mention of one of them counts for this day.&#x20;
{% endhint %}

{% hint style="info" %}
If the user misses one day, the streak count will not be reset to zero and will continue the next day.
{% endhint %}

## <mark style="color:$primary;">When the Game is Finished.</mark>

After the word streak ends, a purple embedded message with detailed leaderboard and results will be posted in the **Discord** channel you selected as the <mark style="color:$info;">**Info Channel**</mark>. If multiple users have the same score, one will be chosen at random.

<figure><img src="/files/Txu2Jd1QF0DcgRE2UpJc" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Don't ask us why some usernames rendered as IDs - we don't have a clue!😁 It is a **Discord** issue, and there is no difference for <mark style="color:purple;">**Bocto**</mark> between them. Just don't mind.
{% endhint %}

{% hint style="danger" %}
And don't forget to send the promised prizes!
{% endhint %}


# Commands and Widgets

The Word Streak offers a set of Discord commands to give users various types of statistics. here is the list of all of them.

## <mark style="color:$primary;">Current Server Active Streaks List.</mark>

The `/wordstreak-events` command shows the embed with a list of all active <mark style="color:blue;">**Word Streak**</mark> events on the current server and their details.

<figure><img src="/files/UxTVT5FZw3QwgOaijOKm" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
This message can only be seen by the user who launched the command.
{% endhint %}

## <mark style="color:$primary;">User's Current Server Active Streaks Progress.</mark>

The `/wordstreak-user-streak` command shows the embed with a list of user progress in all active <mark style="color:blue;">**Word Streak**</mark> events on the current server.

Run the command. It will ask you to select a user whose progress you want to see:

<figure><img src="/files/C5p5UsEkAMQrmL54s1ig" alt=""><figcaption></figcaption></figure>

If you wish to check your own progress, then choose your name. The embed with the list of active streaks on this server that the user took part in will appear:

<figure><img src="/files/UKXTOIX7ruDXQxclUriD" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
This message can only be seen by the user who launched the command.
{% endhint %}

## <mark style="color:$primary;">User's Cross-Server All-Time Streaks Stats.</mark>

The `/wordstreak-global-user-stats` command shows the embed with all-time <mark style="color:blue;">**Word Streak**</mark> stats across all <mark style="color:purple;">**Bocto**</mark> servers.

Run the command. It will ask you to select a user whose global stats you want to see:

<figure><img src="/files/8KPlXkhUiw9PnlpnArU3" alt=""><figcaption></figcaption></figure>

If you wish to check your own stats, then choose your name. The embed with the global statistics across all streaks that have ever happened on any server and that the user has ever taken part in will appear:

<figure><img src="/files/xdequ1fehSsswrBRs7mU" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
This message can only be seen by the user who launched the command.
{% endhint %}

## <mark style="color:$primary;">Top 10 Current Server Active Streaks Leaderboard.</mark>

The `/wordstreak-leaderboard` command shows embeds with the Top 10 <mark style="color:blue;">**Word Streak**</mark> leaderboard for each active streak on the current server.

<figure><img src="/files/MjjljRfNlWyvdQGNTuvZ" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
This message is visible to all users.
{% endhint %}

## <mark style="color:$primary;">Full Current Server Active Streaks Leaderboard.</mark>

The `/wordstreak-leaderboard-paged` command shows the embed with the full <mark style="color:blue;">**Word Streak**</mark> leaderboard for a particular event with pagination.

Run the command. The embed with the dropdown containing the active streaks list will appear:

<figure><img src="/files/60JVmatKsMQKHma6Pmjt" alt=""><figcaption></figcaption></figure>

Click on the desired streak. The embed with the full leaderboard, divided into pages with 10 users per page and pagination, will appear:

<figure><img src="/files/1LoP72l7yPaXd2Ga2obq" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
This message can only be seen by the user who launched the command.
{% endhint %}

## <mark style="color:$primary;">All-Time Global Users Top.</mark>

The `/wordstreak-global-users-top` command shows the embed with the all-time <mark style="color:blue;">**Word Streak**</mark> users leaderboard across all <mark style="color:purple;">**Bocto**</mark> servers.

<figure><img src="/files/PJjBkhT6DNCzQrugmuWs" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
This message can only be seen by the user who launched the command.
{% endhint %}

## <mark style="color:$primary;">All-Time Global Servers Top.</mark>

The `/wordstreak-global-servers-top` command shows the embed with the all-time <mark style="color:blue;">**Word Streak**</mark> servers leaderboard (top guilds by streak activity).

<figure><img src="/files/Yd70fSb1I9LcexgfHeFj" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
&#x20;This message can only be seen by the user who launched the command.
{% endhint %}

## <mark style="color:$danger;">Important!</mark>

To allow users to use these commands in the desired channel, don't forget to grant the <mark style="color:$success;">Use Application Commands</mark> permissions to the desired roles in the channel settings!

<figure><img src="/files/xyvGfrmKPlrF9hdeEFzF" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/HZPelcK4TKR1r2efBxbN" alt=""><figcaption></figcaption></figure>


# Utilities

{% content-ref url="/pages/tTH5QAh5VmGZPoaZKjw7" %}
[Introduction](/plugins/utilities/introduction)
{% endcontent-ref %}

{% content-ref url="/pages/zTgdbPuNzAGLQTH0BXKu" %}
[User Activity Tracker](/plugins/utilities/user-activity-tracker)
{% endcontent-ref %}

{% content-ref url="/pages/hBgtD5kuXlZX5v1y3uTh" %}
[User Wallet Storage](/plugins/utilities/user-wallet-storage)
{% endcontent-ref %}


# Introduction

## <mark style="color:$primary;">Overview.</mark>&#x20;

<mark style="color:blue;">**Utilities**</mark> is a plugin that provides your **Discord** server with simple, handy tools that make your teammates' lives easier by automating some types of routine work.

## <mark style="color:$primary;">Utilities List.</mark>

### <mark style="color:purple;">User Activity Tracker.</mark>

This feature enables tracking users' activity (counts messages sent during a specific time interval) on demand and shows the resulting table after being stopped.

### <mark style="color:purple;">User Wallet Storage.</mark>

This feature allows quick access to user wallets across all Bocto guilds.

## <mark style="color:$primary;">Before Setup.</mark>

To start using the utilities, you need to enable the plugin. To do this, click on the switcher located on the left side of the top bar panel.

<figure><img src="/files/551zHoKmLZI5pwWuwMDt" alt=""><figcaption></figcaption></figure>


# User Activity Tracker

This feature enables tracking users' activity (counts messages sent during a specific time interval) on demand and shows the resulting table after being stopped.

## <mark style="color:$primary;">Use Case.</mark>

This feature was originally invented to help us count users' messages during our daily live rumbles on **OctoPeeps** server, which we run in person, starting it manually. Of course, we want to encourage our users to make us a company and have some fun in the chat together. That is why we provide custom rumble rewards depending on the number of messages users have sent during the match.

However, counting all the messages manually every time was always quite annoying. Now, the <mark style="color:$primary;">**User Activity Tracker**</mark> does it for us. And, since this is our only use case for this utility at the moment, in this guide, we will demonstrate how this feature works specifically on it.

So, before we start the rumble, we launch the <mark style="color:$primary;">**User Activity Tracker**</mark> using `/start-activity-tracker` command. Now, every time users post messages or GIFs, Bocto counts them:

<figure><img src="/files/YnPLJqeZqXfJ5V13hBIV" alt=""><figcaption></figcaption></figure>

And when the rumble is over, we stop the <mark style="color:$primary;">**User Activity Tracker**</mark> using `/stop-activity-tracker` command and get the embed message with the results:

<figure><img src="/files/Cf4j4iDpu2BAHgAj5Hta" alt=""><figcaption></figcaption></figure>

Now we can use this data to give different amounts of coins to users, thus making the reward process much fairer, rather than using the default rumble results, which do not take into account real users' engagement.

## <mark style="color:$primary;">Feature Specifics.</mark>

* This feature does not count messages shorter than one character unless they are an emoji, image, or GIF.
* Being started, this feature works across all your channels. That is, you can not launch more than one tracker at a time.
* If you want to exclude messages in certain channels or from certain roles, or admins from the count, you can set the exceptions in the [feature configuration](https://app.gitbook.com/o/PP99adWq6pg0a9ekqlE1/s/nX757myueIMa0YXG4HJl/~/changes/69/plugins/utilities/user-activity-tracker#user-activity-tracker-configuration).
* This function can only be started and stopped manually when needed using the available commands.

## <mark style="color:$primary;">User Activity Tracker Activation.</mark>

To activate the <mark style="color:$primary;">**User Activity Tracker**</mark>, go to the <mark style="color:$primary;">**Select a Plugin**</mark> page and click on the <mark style="background-color:purple;">`≡ Features`</mark> button on the <mark style="color:blue;">**Utilities**</mark> card.

<figure><img src="/files/pvHAwmuCT1T908C7xv8i" alt=""><figcaption></figcaption></figure>

Now, activate the <mark style="color:$primary;">**User Activity Tracker**</mark> by clicking on the switcher on the corresponding card, and confirm activation.

<figure><img src="/files/lLWlxsYtSrSv7M9DnOo2" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">User Activity Tracker Configuration.</mark>

After activation is done, you need to configure the feature. To do this, click the <mark style="background-color:purple;">`≡ Configure`</mark> button on this card to visit the feature settings page.

<figure><img src="/files/Blq8BDuk9Q0N2L8I0Y7b" alt=""><figcaption></figcaption></figure>

On the settings page, there are two sections.&#x20;

In the <mark style="color:$success;">SETTINGS</mark> section, you can exclude admins from the count if you don't want they to participate in the activity competition.

In the <mark style="color:$success;">PERMISSIONS</mark> section, you can exclude certain roles from the count if you don't want they to participate in the activity competition, or certain channels if you don't want to count messages in certain channels during the event.

<figure><img src="/files/5OCsJ6A76SBGrOB9iy8N" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Available Commands.</mark>

`/start-activity-tracker`  Start tracking the number of messages sent by users in the current channel.\
`/stop-activity-tracker`  Stop tracking users' activity in the current channel.


# User Wallet Storage

This feature allows quick access to user wallets across all Bocto guilds.

## <mark style="color:$primary;">Use Case.</mark>

Almost every community has active users who constantly win prizes. And every time these users come to claim their reward, the manager has to ask for their wallet addresses again to ensure that nothing has changed since the last time. It makes the process longer, adding +1 step to the communication.

However, as far as <mark style="color:purple;">**Bocto**</mark> collects users' wallets across servers via [**Verify Roles**](/plugins/verify-roles), we can provide access to them to every server manager. All you need to do is use a special command, and if the user previously passed the NFT verification on one of the servers with <mark style="color:purple;">**Bocto**</mark>, you will see the list of all wallets they added:

<figure><img src="/files/An8MFmrtHZTHcqqbtHdN" alt=""><figcaption></figcaption></figure>

You can find the detailed guide on [how to use](#how-to-use) this feature at the end of this page.

## <mark style="color:$primary;">User Wallet Storage Activation.</mark>

To activate the <mark style="color:$primary;">**User Wallet Storage**</mark>, go to the <mark style="color:$primary;">**Select a Plugin**</mark> page and click on the <mark style="background-color:purple;">`≡ Features`</mark> button on the <mark style="color:blue;">**Utilities**</mark> card.

<figure><img src="/files/pvHAwmuCT1T908C7xv8i" alt=""><figcaption></figcaption></figure>

Now, activate the <mark style="color:$primary;">**User Wallet Storage**</mark> by clicking on the switcher on the corresponding card, and confirm activation. That's all, now you can use the command on your server!

<figure><img src="/files/C6OVdDrOlLwclgExjTNy" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Available Commands.</mark>

`/get-user-wallets`  Get all wallet addresses associated with a user across all Bocto guilds.&#x20;

{% hint style="success" %}
This command can be used only by roles with Administrator permissions, so you don't have to worry about other users running it and seeing someone else's wallets.
{% endhint %}

## <mark style="color:$primary;">How to Use.</mark>

Run the  `/get-user-wallets` command in the support ticket and select the user. You will only see the list of users who have access to this channel:

<figure><img src="/files/hvds9e3oKRuRu9eTXxyT" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/K6MWQ8IWC9v2BU4C4PL6" alt=""><figcaption></figcaption></figure>

Then press Enter to confirm. If the user previously added at least one wallet to our system via any server with <mark style="color:purple;">**Bocto**</mark>, you will see the embed with their wallet list:

<figure><img src="/files/cMjbEBFrP4xH3AuSLJe6" alt=""><figcaption></figcaption></figure>

If the wallet is not in our system, you will see another embed:

<figure><img src="/files/lQWIGbZzCP8viNM3C6OE" alt=""><figcaption></figcaption></figure>


# Setting Up Channels Permissions

This is the additional information page and you can skip it until you will be readdressed here from other sections of the documentation when needed.

## <mark style="color:$primary;">The Common Problem with the Permissions.</mark>

Most <mark style="color:purple;">**Bocto**</mark> plugins operate in public channels with the default rights granted to the bot during the [Setup process](/getting-started/setup-on-server). Although even if a channel seems to be public, from a technical point of view, it may still be private. If it's really the case, <mark style="color:purple;">**Bocto**</mark> will not be able to post any messages in such a channel and probably will not be able to warn you about it at the time! You will see the alert only in the <mark style="color:yellow;">**#alerts**</mark> channel and on the <mark style="color:purple;">**Bocto**</mark> Dashboard **Settings** page when the first unsuccessful posting attempt to the channel takes place.

To prevent this, ensure that the channel you want <mark style="color:purple;">**Bocto**</mark> to post something in is really public by looking at its name in the sidebar - if there is no 🔒 icon on a <mark style="color:yellow;">**#**</mark> sign, then everything is set up correctly, but if you see one, that means you've probably used an incorrect settings combination for the <mark style="color:yellow;">**@everyone**</mark> role.

<figure><img src="/files/8X5qtQ6IzUpsPKn6lzRj" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">But why did it even happen?</mark>&#x20;

The <mark style="color:yellow;">**@everyone**</mark> role is a system role, and its permissions must be configured specially so that all bots on your server can operate in public channels normally. And here, we need to dive deeper into the **Discord** role permissions concept, which recognizes two types or levels of permissions for every role, especially for the <mark style="color:yellow;">**@everyone**</mark> role:&#x20;

* <mark style="color:orange;">**Global level**</mark> (when the role permissions are applied to all channels across the server by default in the server settings).
* <mark style="color:orange;">**Local level**</mark> (when the same role permissions are set manually for every channel, thus overriding these are set on a Global level).

Actually, this concept is quite simple and works as follows: You can assign global permissions to every role in the global **Discord** settings and change some of the same role permissions in every channel locally, depending on your needs.

And sometimes it happened the way that you've granted the <mark style="color:$success;">View Channels</mark> permission for <mark style="color:yellow;">**@everyone**</mark> on the global level and forgot about it. And lately, to hide public channels from the users with this role (unverified users), you directly restrict this permission locally in these channels' settings, thus turning them into technically private ones. This failure combination of the permission settings looks like this:

<div><figure><img src="/files/k8EP21bHgDS4uQ0iPiEC" alt=""><figcaption><p> The <mark style="color:$success;">View Channels</mark> permission granted for <mark style="color:yellow;"><strong>@everyone</strong></mark> on the global level - never do this!</p></figcaption></figure> <figure><img src="/files/YFGeMYoil5c9g2p5jwki" alt=""><figcaption><p> The <mark style="color:$success;">View Channels</mark> permission revoked from <mark style="color:yellow;"><strong>@everyone</strong></mark> on the local level at the same time.</p></figcaption></figure></div>

{% hint style="danger" %}
Just remember - every time you activate the red cross button in front of <mark style="color:$success;">View Channel</mark> permission for the <mark style="color:yellow;">**@everyone**</mark> role in the **Channel Permissions**, it makes the channel private, and, in most cases, inaccessible for <mark style="color:purple;">**Bocto**</mark> even if some roles besides <mark style="color:yellow;">**@everyone**</mark> have permission to post in this channel! So we need to avoid this!
{% endhint %}

<figure><img src="/files/j7NK1PIJbMwcXvXsdpCB" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">What can you do with it?</mark>&#x20;

Just make the channel public again and reconfigure your server settings the way it works without the necessity of revoking the <mark style="color:$success;">View Channels</mark> permission for the <mark style="color:yellow;">**@everyone**</mark> role in public channels, or, if not applicable, keep them private and continue reading to learn how to set up custom permissions for <mark style="color:purple;">**Bocto**</mark> in private channels.

## <mark style="color:$primary;">Separate Permissions for Bocto in Private Channels.</mark>

Earlier, we studied how to provide <mark style="color:purple;">**Bocto**</mark> access to your public channels by default, not to mess with its permissions manually. But what if you want to allow <mark style="color:purple;">**Bocto**</mark> to operate in some private channels? In this case, you need to grant <mark style="color:purple;">**Bocto**</mark> the <mark style="color:$success;">View Channel</mark> permissions for these channels manually. To be more precise, you need to grant this permission to the <mark style="color:yellow;">**@Bocto**</mark> role.

Let's, for example, imagine you want to run the <mark style="color:$primary;">**Word Streak Game**</mark> from the <mark style="color:blue;">**Mini Games**</mark> plugin in your <mark style="color:yellow;">**#holders-chat**</mark>, which is, of course, a private one. That means that, unlike <mark style="color:yellow;">**#public-chat**</mark>, <mark style="color:purple;">**Bocto**</mark> does not have access to it by default. And when creating a game and choosing this channel, after a short check, you will see the alert like this:

<figure><img src="/files/JS3zxRemoTQFEaP25aMS" alt=""><figcaption></figcaption></figure>

So you need to grant <mark style="color:purple;">**Bocto**</mark> the <mark style="color:$success;">View Channel</mark> permissions for this channel manually. To be more precise, you need to grant this type of permission to the <mark style="color:yellow;">**@Bocto**</mark> role.

To do this, go to **Discord**, open the <mark style="color:yellow;">**#holders-chat**</mark> (or corresponding) channel settings, move to the **Channel Permissions** section, and press the <mark style="color:purple;">**Add members or roles**</mark> button.

<figure><img src="/files/UTGK9mRPq0NbV8uJZbsP" alt=""><figcaption></figcaption></figure>

Now find <mark style="color:purple;">**Bocto**</mark> in the **Roles** list and set the check mark against it. Press the <mark style="color:purple;">**Done**</mark> button.

<figure><img src="/files/j7Mm419QvDDGGwopX9sm" alt=""><figcaption></figcaption></figure>

You will now see <mark style="color:purple;">**Bocto**</mark> in the **ROLES/MEMBERS** list in the **Advanced permissions** section. Select it, and forcibly allow the <mark style="color:$success;">View Channel</mark> permission by clicking on a green check mark.

<figure><img src="/files/CXKHSnsBHq3zGr5ovti6" alt=""><figcaption></figcaption></figure>

After this, go back to the <mark style="color:purple;">**Bocto**</mark>**&#x20;Dashboard**, close the game creation form, and open it again. This time, when you choose the <mark style="color:yellow;">**#holders-chat**</mark> channel, the alert won't appear.

{% hint style="success" %}
Use this trick every time you receive a message in the **Dashboard** or in the <mark style="color:yellow;">**#alerts**</mark> channel indicating that <mark style="color:purple;">**Bocto**</mark> does not have access to post messages or perform other actions in certain channels.
{% endhint %}


# Getting Collection Slug/Symbol

This is the additional information page and you can skip it until you will be readdressed here from other sections of the documentation when needed.

Before you proceed with adding a collection to the <mark style="color:blue;">**NFT Stats**</mark> or tracking its listings and sales with the <mark style="color:blue;">**NFT Tracker**</mark> or setting up a <mark style="color:$primary;">Specific Traits-Based Roles</mark> rule with the <mark style="color:blue;">**Verify Roles**</mark> plugin, you first need to prepare the <mark style="color:$success;">Collection Slug</mark> (for the collections listed on <mark style="color:$warning;">**OpenSea**</mark>) or the <mark style="color:$success;">Collection Symbol</mark> (for the collections listed on <mark style="color:$warning;">**Magic Eden**</mark>). Technically, this is absolutely the same thing, just named differently on these two marketplaces. So let's call it <mark style="color:$success;">Collection Slug</mark> for shot.&#x20;

Well, the <mark style="color:$success;">Collection Slug</mark> is a part of the marketplace collection URL in the browser address bar, normally located after the last slash, but not always.

## <mark style="color:$primary;">Collection Slug on OpenSea.</mark>

<figure><img src="/files/BU4PmHcFmrOMWXm0pguq" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Collection Symbol on Magic Eden.</mark>

<figure><img src="/files/zuxWXDQV510u0kVrdJ29" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Contract Address on LooksRare.</mark>

The collections listed on <mark style="color:$warning;">**LooksRare**</mark> do not have a <mark style="color:$success;">Collection Slug</mark>, and you don't need it. However, you will need the collection <mark style="color:$success;">Contract Address</mark>, which can be found in the same way, at the end of the collection URL.

<figure><img src="/files/CEkxBfI9pPbnf8SjfQqy" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">What's next?</mark>

Now, when you have your <mark style="color:$success;">Collection Slug</mark>, you can proceed with [adding a collection](/plugins/nft-stats/adding-new-collection-with-rarible) to the <mark style="color:blue;">**NFT Stats**</mark> or tracking a collection's listings and sales with the <mark style="color:blue;">**NFT Tracker**</mark> or setting up a [Specific Traits-Based Roles](/plugins/verify-roles/introduction#specific-traits-based-roles) rule with the <mark style="color:blue;">**Verify Roles**</mark> plugin.


# Getting Collection Slug/Symbol with Rarible

This is the additional information page and you can skip it until you will be readdressed here from other sections of the documentation when needed.

Before you proceed with adding a collection to the <mark style="color:blue;">**NFT Stats**</mark> or tracking its listings and sales with the <mark style="color:blue;">**NFT Tracker**</mark> or setting up a <mark style="color:$primary;">Specific Traits-Based Roles</mark> rule with the <mark style="color:blue;">**Verify Roles**</mark> plugin, you first need to prepare the <mark style="color:$success;">Collection Slug</mark> (for the collections listed on <mark style="color:$warning;">**OpenSea**</mark> and <mark style="color:$warning;">**Rarible**</mark>) or the <mark style="color:$success;">Collection Symbol</mark> (for the collections listed on <mark style="color:$warning;">**Magic Eden**</mark>). Technically, this is absolutely the same thing, just named differently on these two marketplaces. So let's call it <mark style="color:$success;">Collection Slug</mark> for shot.&#x20;

Well, the <mark style="color:$success;">Collection Slug</mark> is a part of the marketplace collection URL in the browser address bar, normally located after the last slash, but not always.

## <mark style="color:$primary;">Collection Slug on OpenSea.</mark>

<figure><img src="/files/BU4PmHcFmrOMWXm0pguq" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Collection Symbol on Magic Eden.</mark>

<figure><img src="/files/zuxWXDQV510u0kVrdJ29" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Collection Slug and Contract Address on Rarible.</mark>

On <mark style="color:$warning;">**Rarible**</mark>, the real <mark style="color:$success;">Collection Slug</mark> is not needed, so you can skip this step if you are going to add a collection listed on this marketplace. But if you still want to use the original <mark style="color:$success;">Collection Slug</mark>, you should keep in mind that on <mark style="color:$warning;">**Rarible**</mark>, it has a different location.

For the collection, listed on <mark style="color:$warning;">**Rarible**</mark>, you will also need its <mark style="color:$success;">Contract Address</mark>. You can easily find it under the collection description if you click on the **Copy** icon.

<figure><img src="/files/GsjHxFRg8iF6LGdf13xr" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">Contract Address on LooksRare.</mark>

The collections listed on <mark style="color:$warning;">**LooksRare**</mark> do not have a <mark style="color:$success;">Collection Slug</mark>, and you don't need it. However, you will need the collection <mark style="color:$success;">Contract Address</mark>, which can be found in the same way, at the end of the collection URL.

<figure><img src="/files/CEkxBfI9pPbnf8SjfQqy" alt=""><figcaption></figcaption></figure>

## <mark style="color:$primary;">What's next?</mark>

Now, when you have your <mark style="color:$success;">Collection Slug</mark>, you can proceed with [adding a collection](/plugins/nft-stats/adding-new-collection-with-rarible) to the <mark style="color:blue;">**NFT Stats**</mark> or tracking a collection's listings and sales with the <mark style="color:blue;">**NFT Tracker**</mark> or setting up a [Specific Traits-Based Roles](/plugins/verify-roles/introduction#specific-traits-based-roles) rule with the <mark style="color:blue;">**Verify Roles**</mark> plugin.


# Getting Collection Contract Address

This is the additional information page and you can skip it until you will be readdressed here from other sections of the documentation when needed.

Before you proceed with adding a collection to the <mark style="color:blue;">**NFT Stats**</mark> or tracking its mint events with the <mark style="color:blue;">**NFT Tracker**</mark> or setting up token-gated rules for it with the <mark style="color:blue;">**Verify Roles**</mark> plugin, you first need to prepare the <mark style="color:$success;">Contract Address</mark> (for the collections on <mark style="color:$warning;">**Ethereum**</mark>, <mark style="color:$warning;">**Polygon**</mark>, and <mark style="color:$warning;">**Solana**</mark>).

## <mark style="color:$primary;">**EVM Collections.**</mark>

With the collections built on EVM blockchains like <mark style="color:$warning;">**Ethereum**</mark> or <mark style="color:$warning;">**Polygon**</mark>, things are going pretty easily. If you are reading this text, that highly likely means that you are the owner and creator of the collection and will know its <mark style="color:$warning;">**Ethereum**</mark> or <mark style="color:$warning;">**Polygon**</mark> contract address. If, for any reason, this is not true and you are being confused with getting the EVM blockchain-based collection contract address, let us know, and we will add this information to this section.

## <mark style="color:$primary;">Solana</mark> <mark style="color:$primary;"></mark><mark style="color:$primary;">**Collections.**</mark>

Well, at the same time, <mark style="color:$warning;">**Solana**</mark> collections have a particularly challenging way of obtaining the correct collection contract addresses, even for their creators! It happens due to the different types of address structures for various collections – some have traditional collection addresses, while others do not. This guide will provide the most universal method for obtaining the correct address to enter in the <mark style="color:$primary;">**Verify Rule**</mark> card <mark style="color:$primary;">**Contract**</mark> field.

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2FTxfMBf0p1jCUnxNM8z9I%2Fimage.png?alt=media&#x26;token=b0f315ba-b281-40e4-8176-894e030c9583" alt="" width="375"><figcaption></figcaption></figure>

<mark style="color:$danger;">**Note:**</mark> If you don’t mind doing some grunt work but read less, then move directly to the [**General concept of address extraction**](https://app.gitbook.com/o/PP99adWq6pg0a9ekqlE1/s/nX757myueIMa0YXG4HJl/~/changes/13/plugins/verify-roles/verification-rules-setup/solana-collections#general-concept-of-the-address-extraction) at the end of this guide.

***

### <mark style="color:$primary;">For collections on Magic Eden.</mark>

#### <mark style="color:purple;">**Action 1.**</mark>

Open the card with any token in the desired collection and scroll it down. If you see the *<mark style="color:$success;">On-chain Collection</mark>* address – that’s perfect – use it right away in the <mark style="color:$primary;">**Verify Rule**</mark> card <mark style="color:$primary;">**Contract**</mark> field, and we're done here! If there is no – move to the next action.

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2FnEccQYuy1UVf87I22XIj%2Fimage.png?alt=media&#x26;token=574a1fb7-bd2b-4a27-b9f4-ee0d855a24bd" alt=""><figcaption></figcaption></figure>

#### <mark style="color:purple;">**Action 2.**</mark>&#x20;

If there is no *<mark style="color:$success;">On-chain Collection</mark>* address in the <mark style="color:$primary;">**Details**</mark> section, then copy the *<mark style="color:$success;">Mint</mark>* address instead and move to the next action.

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2F14lUeHFzBm9I8ZiogZZ7%2Fimage.png?alt=media&#x26;token=30daea09-0321-4295-a5af-cc77cbf88e3d" alt=""><figcaption></figcaption></figure>

#### <mark style="color:purple;">**Action 3.**</mark>&#x20;

Now visit <https://solana.fm/> and paste the *<mark style="color:$success;">Mint</mark>* address you've just copied from the search field. Wait a second for it to appear in the dropdown, then click on it.

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2FZbdTsUV1MkBOOmJ87tn4%2Fimage.png?alt=media&#x26;token=ee82853c-f0cd-4581-94f7-5b9c7e8a4c60" alt=""><figcaption></figcaption></figure>

#### <mark style="color:purple;">**Action 4.**</mark>&#x20;

Now, copy the *<mark style="color:$success;">UPDATE AUTHORITY</mark>* address and use it in the <mark style="color:$primary;">**Verify Rule**</mark> card <mark style="color:$primary;">**Contract**</mark> field.

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2F8kEO8raRJ2lqBT1zQb0q%2Fimage.png?alt=media&#x26;token=4bc0105d-43fd-446f-93b8-391ced7ba97a" alt=""><figcaption></figcaption></figure>

#### <mark style="color:purple;">**Just in case**</mark>**&#x20;👇**

* For the collections that have *<mark style="color:$success;">On-chain Collection</mark>* addresses, the *<mark style="color:$success;">UPDATE AUTHORITY</mark>* address will always be different for every NFT in the collection.
* For the collections that have no *<mark style="color:$success;">On-chain Collection</mark>* addresses, the *<mark style="color:$success;">UPDATE AUTHORITY</mark>* address will always be the same for every NFT in the collection.

***

### <mark style="color:$primary;">For collections on Tensor.</mark>

#### <mark style="color:purple;">**Action 1.**</mark>&#x20;

Open the card with any token in the desired collection and click on a blue link in the <mark style="color:$primary;">**Mint**</mark> string. You will be automatically redirected to the corresponding page on [https://solana.fm](https://solana.fm/)

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2F0FydmOGL39eh0bAFofIB%2Fimage.png?alt=media&#x26;token=b6422655-1778-4a77-974a-f87032838408" alt=""><figcaption></figcaption></figure>

#### <mark style="color:purple;">**Action 2.**</mark>&#x20;

Here you will see the *<mark style="color:$success;">COLLECTION ADDRESS</mark>* – use it in the <mark style="color:$primary;">**Verify Rule**</mark> card <mark style="color:$primary;">**Contract**</mark> field. In case there is no *<mark style="color:$success;">COLLECTION ADDRESS</mark>*, use *<mark style="color:$success;">UPDATE AUTHORITY</mark>* instead.

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2FO57eccBAajJb3VdvOUYi%2Fimage.png?alt=media&#x26;token=a8b5c69a-b337-4ffc-b9ff-1351444d473a" alt=""><figcaption></figcaption></figure>

***

### <mark style="color:$primary;">For collections on Mooar.</mark>

#### <mark style="color:purple;">**Action 1.**</mark>

Open the card with any token in the desired collection and expand the <mark style="color:$primary;">**Details**</mark> section.

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2Fz9gR6zB1fDL06iGHwAop%2Fimage.png?alt=media&#x26;token=2ffa24e7-6793-47c4-951e-a3f573ff7a51" alt=""><figcaption></figcaption></figure>

If you see the *<mark style="color:$success;">Contract Address</mark>* string – that’s perfect – use it right away in the <mark style="color:blue;">**Verify Rule**</mark> card <mark style="color:$primary;">**Contract**</mark> field, and we're done here! If there is no – move to the next action.

#### <mark style="color:purple;">**Action 2.**</mark>&#x20;

If there is no *<mark style="color:$success;">Contract Address</mark>* string in the <mark style="color:$primary;">**Details**</mark> section, then click on the *<mark style="color:$success;">Token ID</mark>* link – it will lead you to <https://solscan.io/> where you need to open the <mark style="color:$primary;">**Authority**</mark> dropdown menu and copy the *<mark style="color:$success;">Update Authority</mark>* address. Now, use it in the <mark style="color:$primary;">**Verify Rule**</mark> card <mark style="color:$primary;">**Contract**</mark> field.

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2F6wURCo0x2BLEqsg4CGxp%2Fimage.png?alt=media&#x26;token=5f70d33f-2987-4b0e-aab2-8c7538e20984" alt=""><figcaption></figcaption></figure>

***

### <mark style="color:$primary;">General concept of address extraction.</mark>

If trying to extract the needed address, you will be facing any outstanding situation which is not described in this guide, then the general concept is: you need to somehow extract any token address from the desired collection, search it on <https://solana.fm/> and then get the *<mark style="color:$success;">COLLECTION ADDRESS</mark>* or the *<mark style="color:$success;">UPDATE AUTHORITY</mark>* address in case the *<mark style="color:$success;">COLLECTION ADDRESS</mark>* is missed. To do this, follow the steps below:

#### <mark style="color:purple;">**Action 1.**</mark>

If the NFT on the marketplace opens in a pop-up but not on the new page, expand the NFT card of the token from the desired collection via the special button (<mark style="color:$warning;">**ME**</mark> or <mark style="color:$warning;">**Tensor**</mark>).

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2FGHhjZ1nSD7jfvew11j5h%2Fimage.png?alt=media&#x26;token=0bf2f6fd-55ca-456a-a302-df5fd00cf200" alt=""><figcaption></figcaption></figure>

#### <mark style="color:purple;">**Action 2.**</mark>

Copy the final segment of the URL directly from your browser's address bar. This section may vary across different marketplaces and collections, but you only need the last portion.

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2Fav44mAmDOqvjdjC3Qqx2%2Fimage.png?alt=media&#x26;token=203118b9-0904-437a-a03d-494258baaa7b" alt=""><figcaption><p>On Magic Eden</p></figcaption></figure>

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2FatDPVwoLW3iVv1w9TGg3%2Fimage.png?alt=media&#x26;token=062aba05-7ff3-4375-b410-96b1efd7721e" alt=""><figcaption><p>On Tensor</p></figcaption></figure>

<figure><img src="https://224322153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2Aev6Sv1KSaFQZcTu6Wk%2Fuploads%2FjWVPwVFlqGEaLKziZxDr%2Fimage.png?alt=media&#x26;token=9c2b537b-3d32-4226-8327-ca9ac2d11505" alt=""><figcaption><p>On Mooar</p></figcaption></figure>

#### <mark style="color:purple;">**Action 3.**</mark>

Search the address on <https://solana.fm/> and get the *<mark style="color:$success;">COLLECTION ADDRESS</mark>* or the *<mark style="color:$success;">UPDATE AUTHORITY</mark>* address in case the *<mark style="color:$success;">COLLECTION ADDRESS</mark>* is missed.

***

## <mark style="color:$primary;">What's next?</mark>

Now, when you have a correct <mark style="color:$warning;">**Solana**</mark> NFT collection <mark style="color:$success;">Contract Address</mark>, you can proceed with tracking its mint events with the <mark style="color:blue;">**NFT Tracker**</mark> or setting up token-gated rules for it with the <mark style="color:blue;">**Verify Roles**</mark> plugin.


# Getting a Custom Coin Address


# Server vs Channels Permissions

This is the additional information page and you can skip it until you will be readdressed here from other sections of the documentation when needed.

## <mark style="color:$primary;">The Common Problem with the Permissions.</mark>

Most <mark style="color:purple;">**Bocto**</mark> plugins operate in public channels with the default rights granted to the bot during the [Setup process](/getting-started/setup-on-server). Although sometimes, even if a channel seems to be public, from a technical point of view, it is still private. If it's really the case, <mark style="color:purple;">**Bocto**</mark> will not be able to post any messages in such a channel and probably will not be able to warn you about it at the time! You will only see the alert in the <mark style="color:yellow;">**#alerts**</mark> channel and on the <mark style="color:purple;">**Bocto**</mark> Dashboard **Settings** page when the first unsuccessful posting attempt to the channel takes place.

To prevent this, ensure that the channel you want <mark style="color:purple;">**Bocto**</mark> to post something in is really public by looking at its name in the sidebar - if there is no 🔒 icon on a <mark style="color:yellow;">**#**</mark> sign, then everything is set up correctly, but if you see one, that means you've probably used an incorrect settings combination for the <mark style="color:yellow;">**@everyone**</mark> role.

<figure><img src="/files/8X5qtQ6IzUpsPKn6lzRj" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">But why did it even happen?</mark>&#x20;

Here, we need to dive deeper into the **Discord** roles concept, which recognizes two types or levels of permissions for every role, especially for <mark style="color:yellow;">**@everyone**</mark>, which is a system role:&#x20;

* <mark style="color:orange;">**Global level**</mark> (when the role permissions are applied to all channels across the server by default in the server settings).
* <mark style="color:orange;">**Local level**</mark> (when the same role permissions are set manually for every channel, thus overriding these are set on a Global level).

Actually, this concept is quite simple and works as follows: You can assign global permissions to every role in the global **Discord** settings and change some of the same role permissions in every channel locally, depending on your needs.

And sometimes it happened the way that you've granted the <mark style="color:$success;">View Channels</mark> permission for <mark style="color:yellow;">**@everyone**</mark> on the global level and forgot about it. And lately, to hide public channels from the users with this role (unverified users), you directly restrict this permission locally in these channels' settings, thus turning them into technically private ones. This failure combination of the permission settings looks like this:

<div><figure><img src="/files/k8EP21bHgDS4uQ0iPiEC" alt=""><figcaption><p> The <mark style="color:$success;">View Channels</mark> permission granted for <mark style="color:yellow;"><strong>@everyone</strong></mark> on the global level - never do this!</p></figcaption></figure> <figure><img src="/files/YFGeMYoil5c9g2p5jwki" alt=""><figcaption><p> The <mark style="color:$success;">View Channels</mark> permission revoked from <mark style="color:yellow;"><strong>@everyone</strong></mark> on the local level at the same time.</p></figcaption></figure></div>

{% hint style="danger" %}
Just remember - every time you activate the red cross button in front of <mark style="color:$success;">View Channel</mark> permission for the <mark style="color:yellow;">**@everyone**</mark> role in the **Channel Permissions**, it makes the channel private, and, in most cases, inaccessible for <mark style="color:purple;">**Bocto**</mark> even if some roles besides <mark style="color:yellow;">**@everyone**</mark> have permission to post in this channel! So we need to avoid this!
{% endhint %}

<figure><img src="/files/j7NK1PIJbMwcXvXsdpCB" alt=""><figcaption></figcaption></figure>

### <mark style="color:purple;">What can we do with it?</mark>&#x20;

There are two main ways to configure permissions on your server. The first prevents public channels from becoming technically private, thereby blocking bot activity in those channels. The second involves manually reassigning permissions for each channel.

The common staff for both is that you need to set all the permissions for the <mark style="color:yellow;">**@everyone**</mark> role on the global level to be turned off. This is actually the default **Discord** setting when users with the <mark style="color:yellow;">**@everyone**</mark> role only do not have any permissions, even to view channels. Let's set it up.

For this, open the **Discord s**erver settings (Global settings):

<figure><img src="/files/YMn0itP4Ljl9k7zAHw5C" alt=""><figcaption></figcaption></figure>

Then choose **Roles**, and at the top of the main section, you will see the **Default Permissions** block. Click on it to get access to the <mark style="color:yellow;">**@everyone**</mark> role global settings.

<figure><img src="/files/O5ltRWaV20azRBk5NcW1" alt=""><figcaption></figcaption></figure>

If the <mark style="color:$success;">Clear permissions</mark> link is active, click it - it will turn all the switches off.  This means new users will not see anything when they join your server. Don't worry, we will fix it soon.

<figure><img src="/files/YZO3XyDTVD4MTQwMuaGP" alt=""><figcaption></figcaption></figure>

This is exactly how users with the <mark style="color:yellow;">**@everyone**</mark> role only, which is configured using the default settings for every channel, should see your server, in case you didn't change any permissions settings locally via channel settings:

<figure><img src="/files/jWrySFOsQaifcdQ7geZ5" alt=""><figcaption></figcaption></figure>

But what if you want to make some channels visible to users (which means make these channels technically public), but prevent posting there or performing other actions for users with the <mark style="color:yellow;">**@everyone**</mark> role only? Here we come to our methods mentioned above.

## <mark style="color:$primary;">Method 1. Setting Up a Middle-Man Role with Basic Permissions.</mark>

The main idea of this method, [after you've disabled all <mark style="color:yellow;">**@everyone**</mark> role permissions globally](https://app.gitbook.com/o/PP99adWq6pg0a9ekqlE1/s/nX757myueIMa0YXG4HJl/~/changes/48/getting-started/server-and-channels-permissions#what-can-we-do-with-it), is to automatically assign a special custom <mark style="color:$info;">**@Verified**</mark> role with basic permissions (<mark style="color:$success;">View Channels</mark>, <mark style="color:$success;">Send Messages and Create Posts</mark>, <mark style="color:$success;">Send Messages in Threads and Posts</mark>, <mark style="color:$success;">Add Reactions</mark>, <mark style="color:$success;">Read Message History</mark>) to those who perform certain actions, such as clicking on a reaction under a message in the only channel where the <mark style="color:$success;">View Channels</mark> permission for the <mark style="color:yellow;">**@everyone**</mark> role was forcibly overridden to "Allowed" manually via channel settings (i.e., locally). This is how it usually looks:

<figure><img src="/files/aVxUSomCMdiQogabdiaD" alt=""><figcaption></figcaption></figure>

As far as unlike the <mark style="color:yellow;">**@everyone**</mark> role, the <mark style="color:$info;">**@Verified**</mark> role is a custom one, but not a system one, it allows to keep all the public channels technically really public (without a 🔒 icon on a <mark style="color:yellow;">**#**</mark> sign in the channel's name) which is in its turn allows <mark style="color:purple;">**Bocto**</mark> (and other bots on your server) to operate in these channels without any manual interuption into these channels settings from your side, while the management of all basic permissions is now handled by the <mark style="color:$info;">**@Verified**</mark> role at a custom level.

This is the preferred method and the most common practice you can meet on many servers, or you might even be using it too. But the disadvantage of this approach is that it requires setting up a bot that provides the <mark style="color:$success;">Reaction Roles</mark> functionality, which is sometimes a paid option. If you're okay with this, please read <mark style="color:red;">this guide</mark>. If not, try to find a free alternative, or proceed with [**Method 2**](https://app.gitbook.com/o/PP99adWq6pg0a9ekqlE1/s/nX757myueIMa0YXG4HJl/~/changes/48/getting-started/server-and-channels-permissions#method-2.-custom-permissions-for-roles-in-channels).

If, [after disabling all <mark style="color:yellow;">**@everyone**</mark> role permissions globally](https://app.gitbook.com/o/PP99adWq6pg0a9ekqlE1/s/nX757myueIMa0YXG4HJl/~/changes/48/getting-started/server-and-channels-permissions#what-can-we-do-with-it), you've chosen this method, i.e., to autoassign a custom <mark style="color:$info;">**@Verified**</mark> role with basic permissions, which can be gotten by clicking the reaction, you need to set up the bot that provides the Reaction Roles feature. Let us show you how to do this with an example of the most popular Discord bot, MEE6, which has this feature (that, unfortunately, has recently become available only on their Premium plan).

Visit the [MEE6 website](https://mee6.xyz/), set up the MEE6 bot, and pass through all the necessary procedures. Here, we will not discuss how to do it, as it is a topic of the MEE6 setup guide. So let's imagine you've already set it up. Now move to the Reaction Roles page and click on ✅ **Verify** block to enter the Reaction Roles setup page.

<figure><img src="/files/ZtwIFlW9QadoDGz2UjKm" alt=""><figcaption></figcaption></figure>

Here, in the Channel section, keep the **Create one for me** option or choose the custom channel. For the new Discord users, it would be better to allow MEE6 to do all the grunt work for them - like make this channel public and visible for <mark style="color:yellow;">**@everyone**</mark>. So let's keep this option as it is.

<figure><img src="/files/HHDf695IMa2LtZy2lSeN" alt=""><figcaption></figcaption></figure>

In the Message section, just enter something like this:

<figure><img src="/files/FvyHG1VER5ZdFNjCggIq" alt=""><figcaption></figcaption></figure>

<details>

<summary>Message text sample</summary>

**Rules**

* Be respectful. Treat others the way you want to be treated.
* No spamming.
* No NSFW content.
* Do not leak any personal information.
* No shilling.
* Keep all discussions in the relevant channels.

If you are NOT a robot, tap the ✅ reaction.

</details>

In the Reactions and Roles section, keep everything as it is. The <mark style="color:$info;">**@Verified**</mark> role will be created automatically or detected if, for some reason, you already have a role with this name on your server.

In the Reactions Mode section, keep the Default option.

<figure><img src="/files/ZyduiGnWEPyfvfiCWwMZ" alt=""><figcaption></figcaption></figure>

After that, you need to check if the <mark style="color:yellow;">**@everyone**</mark> role permissions for all the public channels on your server are set up like this:

<div><figure><img src="/files/oF9q2ATrGEzknHVcasWt" alt=""><figcaption><p>Wrong Permissions Setup</p></figcaption></figure> <figure><img src="/files/tOeZMnIIt0qUCnCFseAN" alt=""><figcaption><p>Correct Permissions Setup</p></figcaption></figure></div>

Now, only <mark style="color:$info;">**@Verified**</mark> users will be able to see public channels, while users with just the <mark style="color:yellow;">**@everyone**</mark> role will only see the <mark style="color:yellow;">**#access-verify**</mark> channel created by MEE6 with the embedded message we set in this bot and a ✅ reaction under it.

Same time, as we didn't manually prohibit the <mark style="color:yellow;">**@everyone**</mark> role from viewing the public channels, Bocto can operate in them without any special settings. Do you remember our #rich-stats channel with the 🔒 icon on a <mark style="color:yellow;">**#**</mark> sign from the first image in this guide? Let's see how it looks now:

<figure><img src="/files/XBcJtox7YXbyC5IADvI9" alt=""><figcaption></figcaption></figure>

But, if for some reason you need to allow some Bocto functions to operate in private channels, read this article.

## <mark style="color:$primary;">Method 2. Setting Up Custom Permissions for the Roles.</mark>

The main idea of this method, [after you've disabled all <mark style="color:yellow;">**@everyone**</mark> role permissions globally](https://app.gitbook.com/o/PP99adWq6pg0a9ekqlE1/s/nX757myueIMa0YXG4HJl/~/changes/48/getting-started/server-and-channels-permissions#what-can-we-do-with-it), is to override the permissions for all roles, including the <mark style="color:yellow;">**@everyone**</mark> role, on a local level in every channel. This is a very lame method because you don't have a middle-man role, like [automatically assigning by MEE6 <mark style="color:$info;">**@Verified**</mark> role](#method-1.-assigning-a-verified-role-with-mee6), which serves as a buffer between users who, by default, have no permissions at all, and those who have all basic permissions in public channels. Of course, you can create and set up the permissions for this role manually, but it is pointless because you will have to assign it manually as well.&#x20;

So you won't be able to differentiate users' access flexibly anyway, and the solution here is to make your server private (for your holders only), keeping only the <mark style="color:yellow;">**#nft-verify**</mark> channel (or some info channels too) visible for <mark style="color:yellow;">**@everyone**</mark>, and assigning roles to your holders only via our <mark style="color:blue;">**Verify Roles**</mark> plugin. For this, follow <mark style="color:red;">this guide</mark>.

If you've chosen method 2, i.e., to override the global permissions for every role on a local level manually for every single channel, you need to directly grant to every role on your server, including the @Bocto and the <mark style="color:yellow;">**@everyone**</mark> role, the desired permissions.

### <mark style="color:purple;">Special local permissions for the @everyone role.</mark>

Let's get started with the <mark style="color:yellow;">**@everyone**</mark> role. For example, if you want to make some channels like <mark style="color:yellow;">**#about-project**</mark> or <mark style="color:yellow;">**#nft-verify**</mark> visible for <mark style="color:yellow;">**@everyone**</mark>, you need to open channel settings and forcibly allow <mark style="color:$success;">View Channel</mark> and <mark style="color:$success;">Read Message History</mark> for this role directly:

<figure><img src="/files/Wi8A7A3prhN8JDG3A0wk" alt=""><figcaption></figcaption></figure>

This is how the user with the <mark style="color:yellow;">**@everyone**</mark> role only now sees the server:

<figure><img src="/files/YoU0iws3ohYdNa3yn4d8" alt=""><figcaption></figcaption></figure>

Great! Now, when we created the entry point for <mark style="color:yellow;">**@everyone**</mark> on our "Holders only" server, we could [set up verification rules](/plugins/verify-roles/introduction) to provide our holders access to other channels on the server. But first, let's double-check if the <mark style="color:yellow;">**@everyone**</mark> role permissions for all the public channels on your server are set up like this:

<div><figure><img src="/files/oF9q2ATrGEzknHVcasWt" alt=""><figcaption><p>Wrong Permissions Setup</p></figcaption></figure> <figure><img src="/files/tOeZMnIIt0qUCnCFseAN" alt=""><figcaption><p>Correct Permissions Setup</p></figcaption></figure></div>

And, as we didn't manually prohibit the <mark style="color:yellow;">**@everyone**</mark> role from viewing the public channels, Bocto can operate in there without any special settings. Do you remember our #rich-stats channel with the 🔒 icon on a <mark style="color:yellow;">**#**</mark> sign from the first image in this guide? Let's see how it looks now:

<figure><img src="/files/IW8ci4oerb3bJUqcXR7j" alt=""><figcaption></figcaption></figure>

But, if for some reason you need to allow some Bocto functions to operate in private channels, read this article.

### <mark style="color:purple;">Special global permissions for other roles.</mark>

Well, we've done half of the work - Bocto operates correctly, and the <mark style="color:yellow;">**@everyone**</mark> role's only users can see just one channel where they can get their holder roles. But what about these holder roles? Let's imagine our <mark style="color:yellow;">**@everyone**</mark> role user just passed the verification and got the <mark style="color:$primary;">**@At least 1 Kiddo NFT**</mark> role. This is how he sees the server now:

<figure><img src="/files/YoU0iws3ohYdNa3yn4d8" alt=""><figcaption></figcaption></figure>

Yes! This is absolutely the same picture you've already seen above! Why? Just because, as we told, we need to reassign all the needed permissions to every role on both global and local levels. So let's do it.

Let's open server settings again, move to the Roles, choose the <mark style="color:$primary;">**@At least 1 Kiddo NFT**</mark> role in the list, and proceed with the **Permissions** tab. Here, we need to turn on  <mark style="color:$success;">View Channel</mark> and the <mark style="color:$success;">Read Message History</mark> switches.

<figure><img src="/files/WrKj9w49Ne2hFklpfkjE" alt=""><figcaption></figcaption></figure>

We've just set these two permissions for this role by default globally, which means they apply to every public channel across the server until you restrict them on a local level via specified channel settings.

Now our user with the <mark style="color:$primary;">**@At least 1 Kiddo NFT**</mark> role sees the server like this:

<figure><img src="/files/tNsyYHEEN0Yb7fQXORsv" alt=""><figcaption></figcaption></figure>

That's much better! He sees all the public channels and all the previous messages in there, but can't post in chats. But why didn't we allow <mark style="color:$success;">Send Messages and Create Posts</mark>, <mark style="color:$success;">Send Messages in Threads and Posts</mark>, and <mark style="color:$success;">Add reactions</mark> permissions for this role by default as well? Because in this case, he will also be able to post in info channels like <mark style="color:yellow;">**#nft-stats**</mark> or <mark style="color:yellow;">**#nft-verify**</mark>!

We could do it, of course, and then revoke these rules from this role in info channels via the channel settings, so you can use this strategy for sure if you feel it is more suitable for your case. But let us follow the contrarian strategy and add these permissions via the channel settings to the channels where we really need them.

### <mark style="color:purple;">Special global permissions for other roles.</mark>

In our case, we want to allow the <mark style="color:$primary;">**@At least 1 Kiddo NFT**</mark> role users to send messages and add reactions in the <mark style="color:yellow;">**#holders-chat**</mark> only. So let's add this role to the permissions list and set it up.

In the **Channel Permissions** settings, click on this small `⊕` button in the **Advanced** **permissions** section to call the dropdown menu with the list of all server roles:

<figure><img src="/files/8tigAl8fOeQqGrnDMuPK" alt=""><figcaption></figcaption></figure>

In the dropdown, select the role you want to add:

<figure><img src="/files/9He5ZfdKpx3rguXtglcu" alt=""><figcaption></figcaption></figure>

Finally, forcibly allow the desired permissions by clicking on a green check marks:

<figure><img src="/files/QBBgcik6ruUnZGWL3BkB" alt=""><figcaption></figcaption></figure>

You can keep <mark style="color:$success;">View Channel</mark> and <mark style="color:$success;">Read Message History</mark> permissions here as they are, as long as they are already granted to this role by default globally.

Now, for the <mark style="color:$primary;">**@At least 1 Kiddo NFT**</mark> role members, the server will look like this:

<figure><img src="/files/sSO7vOBPoOZtRDk6ICX4" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
If you used **Method 1** to configure the basic permissions, you can make similar changes to the **MEE6** <mark style="color:$primary;">**@Verified**</mark> role, configuring it as needed if its standard settings do not meet your requirements.
{% endhint %}

## <mark style="color:$primary;">Method 3. Setting Up Custom Permissions for the Private Channels.</mark>

Earlier, we studied how to provide <mark style="color:purple;">**Bocto**</mark> access to your public channels by default, not to mess with its permissions manually, and how to configure other roles' permissions for these channels. But what if you want to allow <mark style="color:purple;">**Bocto**</mark> to operate in some private channels? In this case, you need to grant <mark style="color:purple;">**Bocto**</mark> the <mark style="color:$success;">View Channel</mark> permissions for these channels manually. To be more precise, you need to grant this permission to the <mark style="color:yellow;">**@Bocto**</mark> role. And technically, it can be considered as **Method 3**.

Let's imagine that, in addition to our <mark style="color:yellow;">**#holders-chat**</mark>, we also have the <mark style="color:yellow;">**#top-holders-rumble**</mark> channel, which is private and accessible to only <mark style="color:$danger;">**@More than 5 Kiddos**</mark> role members. Let's open the channel settings and look at the **Channel Permissions** section:

<figure><img src="/files/ACfOKDqCfn5KAqpv0DMd" alt=""><figcaption></figcaption></figure>

Here, press the <mark style="color:purple;">**Add members or roles**</mark> button.

<figure><img src="/files/lRyL5PLSwaOYbwzlsrw5" alt=""><figcaption></figcaption></figure>

Now find <mark style="color:purple;">**Bocto**</mark> in the Roles list and set the check mark against it. Press the <mark style="color:purple;">**Done**</mark> button.

<figure><img src="/files/CNeYTGm97UEc7Jd3Cvah" alt=""><figcaption></figcaption></figure>

You will now see <mark style="color:purple;">**Bocto**</mark> in the ROLES/MEMBERS list in the **Advanced permissions** section. Select it, and forcibly allow the <mark style="color:$success;">View Channel</mark> permission by clicking on a green check mark.

<figure><img src="/files/zzwoPCWWl0gOrdo3YPle" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
Use this trick every time you receive a message in the **Dashboard** or in the <mark style="color:yellow;">**#alerts**</mark> channel indicating that <mark style="color:purple;">**Bocto**</mark> does not have access to post messages or perform other actions in certain channels.
{% endhint %}


