# Heroglyphs

### Introduction

Heroglyph Protocol utilizes ***graffiti*** from a produced block to execute custom logic developed by anyone in the ecosystem. Our mission is to promote decentralization within the chain and to empower our heros, the validators.

### The protocol operates through two modules:

1. **Identity**: This is similar to an ENS (Ethereum Name Service), where you create an identity and link it to a wallet. Without one, heroglyph won't execute your produced block
2. **Ticker**: This is similar to an **Identity** but for smart contracts. You don't technically own the ticker. It incorporates a Harberger tax and hijack system, meaning your ticker can be taken away either by someone buying it at your designated price or due to insufficient funds from the tax system.

### Which module is intended for whom

**Identity:** *As of right now*, this is only for Validator, but as soon the delegation system is out, it will be for anyone.

**Ticker** is for Advanced Validators & Developers.&#x20;

* Advanced Validator can use ticker in their advantage (by having a shorter name, or to assure it is always correctly configured)&#x20;
* Developers will need to own a ticker to connect their protocol to Heroglyphs Protocol.


# Validators

## What's a validator

* Solo Validator | Full Validator: Have their own node, with 32 ETHs staked into it, and participate into Ethereum Network
* Minipods: Uses third party services like Rocket Pool, to stake under 32 ETHs to participate into Ethereum Network

## Supported Third Party

Any protocol that allows you to modify the node's graffiti are supported to execute produced block in Heroglyphs.&#x20;

But not all of them are supported to receive attesting rewards (Medals). \
For more: [Attestation (Medals & Badges)](/heroglyphs/validators/attestation-medals-and-badges)

## Getting Started

{% hint style="danger" %}
This is "Getting Started" for Heroglyph Protocol, if you want to enter the Heroglyph Game, go to [How to play](/heroglyphs/game/how-to-play)
{% endhint %}

1. Create an Identity [Identity](/heroglyphs/validators/identity)
2. Generate an Graffiti [Graffiti](/heroglyphs/validators/graffiti)
3. Save the graffiti into your node

Congratulations! You are now a valid hieroglyph validator!

## Attestation Reward

[Attestation (Medals & Badges)](/heroglyphs/validators/attestation-medals-and-badges)

## Multiple Validators

Each validator needs an ID of its own.&#x20;

If you do not want to do multi-graffiti, you can create a **Parent <> Child** relationship

<figure><img src="https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2FkLHVO21EMLGm2cuLqPFZ%2Fimage.png?alt=media&amp;token=c3d0c9f1-a717-41f6-a481-9ef90634e362" alt=""><figcaption><p>Parent &#x3C;> Child Relationship</p></figcaption></figure>

### Create the Parent <> Child Relation

1. Find your id that you wish to be the "Parent". This is the one you will be using in the graffiti
2. Link your other ids with (Add Child Identities)\
   ![](https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2FITdQKlwApcawk8eMMyJ2%2Fimage.png?alt=media\&token=3b07527b-f3d6-442d-9a69-2cc0a13579b2)

## Why my block has been skipped

1. **Bad** **Graffiti:** Graffiti needs to start with `#` and have an ID `@`
2. **Identity Not found:** Your Identity is not attached to the validator index and / or the Child Identity is not linked to the parent.

## Why my Ticker has been ignored

1. **Ticker Not Found:** Ticker doesn't exist
2. **No Contract Found:** No contract attached to the ticker
3. **Ticker Surrendered:** Ticker went underwater by the tax system and is now disabled
4. **Ticker Reverted:** Ticker reverted during execution, the event `TickerReverted` is emitted when it does happen

## Test your Graffiti

You can test your graffiti via our website -> `<f> Graffiti Tool` -> `<w> Test Graffiti`

It will tell you if

* Your Graffiti is well formated
* If your ID is valid
* If your Tickers are valid or Active.&#x20;


# Identity

Graffiti ID, also known as ID, is mandatory for a validator. Without it, your graffiti won't ever be executed.

{% hint style="danger" %}
Identities are soulbound to the Validator Index that you inputted when creating your ID. This is immutable, and the ERC721 token **cannot** be transferred.
{% endhint %}

## Creating an ID

1. Visit our website, then go to "Identities" and select "Create Heroglyph ID."
2. Choose a unique name for your ID.
3. (Optional) Set the wallet that will receive rewards. Leaving it empty will default to your current wallet.

### Find your Validator Index

Go on your validator page on [beaconcha.in](https://beaconcha.in/). Your validator Index is by default next to "Validator".

<figure><img src="https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2FLqYaDL8qeVQqhVI709zt%2Fimage.png?alt=media&amp;token=2972e548-99a9-47ea-9992-2e5ee1ea4fac" alt=""><figcaption><p>In this example, the validator index is 999999999</p></figcaption></figure>

If you renamed your validator, you can still find the index number in the url

> <https://mainnet.beaconcha.in/validator/999999999>


# Graffiti

Heroglyph Graffiti is constructed with the following format:

* `#` precedes the tickers' names, separated by commas.
* `@` precedes the Graffiti Id's name.
* `-` precedes the global chain to execute all tickers on.

If `-` is missing, the default chain will automatically be used as global. If `#` or `@` are missing, the graffiti is invalid and won't be executed by Heroglyphs.

**Note:** You will have to pay the LayerZero fee on the target chain if you are not minting on Arbitrum.

Example of a valid graffiti: `#lueygi,69@atum-a` `#lueygi,69@atum` `#@atum`

Examples of invalid graffiti: `@atum-a` `#lueygi-a` `#lueygi@-a` `lueygi@atum`

### Advanced

You can override a specific ticker's execution chain by adding it after the ticker name: `#TickerNameA:OverriddenChain,TickerNameB@0xAtum`

For example: `#lueygi:h,69@atum` In this example, `lueygi` will be minted on **Base**, and `69` on **Arbitrum**.

### Cross-chain fee & claiming

When minting from another chain, you'll need to pay the layer-zero fee on the target chain, requiring extra steps.

For simplification, let's consider minting `lueygi` on `base`:

1. Switch to Base.
2. Approve WETH for `lueygi`.
3. Execute `lueygi.claimAction(srcChainLzEndpoint, [0])`.
   1. `[0]` is the id of the minting, for simplification, we will say this is our first time doing so

You'll pay the layer-zero fee with WETH and receive your token on the base chain

## Cross-chain graffiti's code

```typescript
enum EGraffitiChains {
  ARBITRUM = "a",
  ETHEREUM = "b",
  BNB_CHAIN = "c",
  AVALANCHE = "d",
  POLYGON = "e",
  OPTIMISM = "f",
  FANTOM = "g",
  DFK = "h",
  HARMONY = "i",
  DEXALOT_SUBNET = "j",
  CELO_MAINNET = "k",
  MOONBEAM = "l",
  FUSE_MAINNET = "m",
  GNOSIS = "n",
  DOS_CHAIN = "o",
  KLAYTN_MAINNET_CYPRESS = "p",
  METIS = "q",
  CORE_BLOCKCHAIN_MAINNET = "r",
  OKXCHAIN_MAINNET = "s",
  POLYGON_ZEVM = "t",
  CANTO = "u",
  ZKSYNC_ERA_MAINNET = "v",
  MOONRIVER = "w",
  TENET = "x",
  ARBITRUM_NOVA = "y",
  METER_MAINNET = "z",
  KAVA = "aa",
  MANTLE = "bb",
  HUBBLE = "cc",
  LINEA = "dd",
  BASE = "ee",
  ZORA = "ff",
  VICTION = "gg",
  LOOT = "hh",
  MERIT_CIRCLE = "ii",
  TELOS_EVM = "jj",
  OPBNB_MAINNET = "kk",
  ASTAR = "ll",
  AURORA_MAINNET = "mm",
  CONFLUX_ESPACE = "nn",
  ORDERLY_MAINNET = "oo",
  SCROLL = "pp",
  HORIZEN_EON_MAINNET = "qq",
  XPLA_MAINNET = "rr",
  MANTA = "ss",
  SHIMMER = "tt",
  INJECTIVE = "uu",
  RARIBLE = "vv",
  XAI = "ww",
  REAL = "xx",
  TILTYARD = "yy",
  BLAST = "zz",
  FRAXTAL = "aaa",
  ASTAR_ZEVM = "bbb",
  MODE = "ccc",
  MASA = "ddd",
  HOMEVERSE = "eee",
  MERLIN = "fff",
  DEGEN = "ggg",
  SKALE = "hhh",
  XLAYER = "iii",
  SANKO = "jjj",
  BOB = "kkk",
}
```


# Attestation (Medals & Badges)

Being a valid hieroglyphs validator has its advantages, such as being rewarded for validating a block. Since producing a block is challenging for most people, we reward you for fulfilling your duty as a validator.

## Supported Third Party Liquid Staking

Here is the supported list of Third-Party Validator Services. They have a different medal rate compared to solo stakers, with a Medal Rate of 100%.

* **Rocket Pool**
  * Medal Rate:  [Minipool Size / 32](#user-content-fn-1)[^1]
* **Eigen Pod**
  * Medal Rate: 70%[^2]

## Claiming

Although all validators are counted, you'll need an Identity to claim (see [Identity](/heroglyphs/validators/identity) for more).&#x20;

{% hint style="danger" %}
Claiming does not use your identity's receiver wallet, by default, badges will be sent to the validator's withdrawal credential for security reasons. However, if you prefer to receive badges in another wallet, you can [#redirect-badges](#redirect-badges "mention") (Before Claiming)
{% endhint %}

### Snapshot Epoch

There are two important points to remember about our snapshot epoch:

1. It advances in increments of 100. For example, if the current epoch is 12501, the next snapshot will be at 12600.
2. Your attesting epoch expires after 30 days if not claimed

## Medals & Badges

{% hint style="info" %}
**Blocks** don't need to be specific to hieroglyphs. All blocks are counted.
{% endhint %}

### Medals

Medals serve as our point system for evaluating your validator:

* Attesting a block: +1 point
* Failing to attest a block: -1 point
* Producing a block: 0 points

In the end, you can claim your Medals to automatically convert them into $Badges

### Badges

{% hint style="warning" %}
Badges are SBT (Soul Bounded Token), you cannot transfer them once you received them
{% endhint %}

1 Medals is worth **0.000297 Badges**. At **1 Badges** you can redeem it for a Genesis Token, as long you have the Genesis Key.

## Redirect Badges

{% hint style="info" %}
Already claimed badges cannot be redirected
{% endhint %}

To redirect your badges to another wallet:

1. Visit our website
2. `<g> Claim` -> `<w> Redirect $BADGES rewards`

You will see this panel

<figure><img src="https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2F9DYJDXcCVUHN5whUuOiG%2Fimage.png?alt=media&amp;token=09ee9d86-54e7-4702-bae0-768b64b32017" alt="" width="548"><figcaption></figcaption></figure>

* **Redirect as Withdrawal Credentials**: You want to **execute** the transaction with your WC wallet
* **Generate Permit Signature**: You don't want to execute with your WC, you can **sign** a transaction with your WC and **execute** on another wallet
* **Redirect with Permit**: This option is to execute the "**Generate Permit Signature**". Any wallet can execute the permit.

## Verify Signature&#x20;

{% hint style="danger" %}
Do not sign any message that you do not understand or that does not align with the following:
{% endhint %}

Before signing, verify the domain of the signature. If you cannot find it or if it does not match, decline it and contact Heroglyphs.

<table data-header-hidden data-full-width="false"><thead><tr><th width="203"></th><th></th></tr></thead><tbody><tr><td><strong>Contract Requester</strong></td><td><pre><code>0xe1439f74cd5286bf28b08978703bed2068de4260
</code></pre></td></tr></tbody></table>

<details>

<summary>Raw Data</summary>

```json
{
    "types": {
        "EIP712Domain": [
            {
                "name": "name",
                "type": "string"
            },
            {
                "name": "version",
                "type": "string"
            },
            {
                "name": "chainId",
                "type": "uint256"
            },
            {
                "name": "verifyingContract",
                "type": "address"
            }
        ],
        "Redirect": [
            {
                "name": "to",
                "type": "address"
            },
            {
                "name": "nonce",
                "type": "uint32"
            },
            {
                "name": "deadline",
                "type": "uint32"
            }
        ]
    },
    "primaryType": "Redirect",
    "domain": {
        "name": "HeroglyphAttestation",
        "version": "v1",
        "chainId": 42161,
        "verifyingContract": "0xe1439f74cd5286bf28b08978703bed2068de4260"
    },
    "message": {
        "to":,
        "nonce":,
        "deadline":
    }
}
```

</details>

### Verify with Metamask

1. Click on "Verify Third-Party details"
2. Be sure the address is the **Contract Requester**&#x20;

<figure><img src="https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2FOBPmrQiFkGgcNbSJ6zen%2Fimage.png?alt=media&amp;token=42fc8df0-dbea-482b-b584-7d48fda725ef" alt="" width="263"><figcaption></figcaption></figure>

### Verify with Rabby

* You can view the **View Raw >** and verify against the Raw Data above.
* Otherwise, make sure the **Interact Contract** is the **Contract Requester**.

<figure><img src="https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2FfEmj3JZTMFfpwqCP7AU1%2Fimage.png?alt=media&amp;token=0bbea6a0-53f8-440d-8b74-c51425efd88e" alt=""><figcaption></figcaption></figure>

### Verify with Other Wallet

the general idea is the same, try to find for a "raw data" or "Interact Contract". Then validate the information

[^1]: RP is the closest of Decentralized Service for Staking. We are only lowering by the minipool size to be fair with solo stakers.

[^2]: Due to the additional risk they pose, we have decided to reduce the rate by 30%.

    Disclaimer: The rate may decrease further to 50% later on.


# States

### Opens

A batch enters the "Queued" state under one of two conditions:

* There are 100 validators in the batch.
* The batch has been open for 2 hours.

### **Queued**

In the "Queued" state, the batch is prepared for execution. It can be initiated manually or automatically when someone attempts to join the batch. Our system also checks for queued batches hourly to start them.

### **Executing**

When a batch is "Executing," it typically indicates a failure. Execution speed is expected to be under then seconds. If a batch remains in this state for four hours, it expires.

### **Expired**

Manual intervention is required to retry the batch.

***


# Non-Validator

{% hint style="danger" %}
Heroglyph **protocol** is powered by validators. As a non-validator, you cannot participate directly into the protocol.\
\
That being said, the product(s) built on top of Heroglyph will most-likely be also for non-validators
{% endhint %}

If you are here for the Heroglyph Game (Genesis Tokens), Please go to [How to play](/heroglyphs/game/how-to-play)


# Technical Zone

Ethereum 2.0 consists of EPOCHs, SLOTs, and BLOCKs. An epoch contains 32 slots, and each slot contains 1 block.&#x20;

It is important to note that not every slot is proposed, so the ratio between blocks and epoch-slots is not consistent. Once a slot has been proposed, it contains multiple pieces of data.&#x20;

See an example from the Beacon chain below. The Heroglyph protocol utilizes the block graffiti\_text to verify whether the text is a Heroglyph recognized Graffiti.

```json
"data": {
    "attestationscount": 128,
    "attesterslashingscount": 0,
    "blockroot": "...",
    "depositscount": 0,
    "epoch": 280373,
    "eth1data_blockhash": "...",
    "eth1data_depositcount": 1460883,
    "eth1data_depositroot": "...",
    "exec_base_fee_per_gas": 20662807983,
    "exec_block_hash": "...",
    "exec_block_number": 19768739,
    "exec_extra_data": "...",
    "exec_fee_recipient": "...",
    "exec_gas_limit": 30000000,
    "exec_gas_used": 11704811,
    "exec_logs_bloom": "...",
    "exec_parent_hash": "...",
    "exec_random": "...",
    "exec_receipts_root": "...",
    "exec_state_root": "...",
    "exec_timestamp": 1714487519,
    "exec_transactions_count": 145,
    "graffiti": "...",
    "graffiti_text": "Lighthouse/v5.1.3-3058b96",
    "parentroot": "...",
    "proposer": 965785,
    "proposerslashingscount": 0,
    "randaoreveal": "...",
    "signature": "...",
    "slot": 8971958,
    "stateroot": "...",
    "status": "1",
    "syncaggregate_bits": "...",
    "syncaggregate_participation": 0.9921875,
    "syncaggregate_signature": "...",
    "voluntaryexitscount": 0,
    "votes": 31448,
    "withdrawalcount": 16
  }
```

***

Heroglyph Protocol is offering the power to utilize the graffiti feature of a validator. It contains four modules:

## **Identity**

A graffiti needs an identity (`@<IdentityName>`) so the block producer can be rewarded. Heroglyph doesn't use the `Fee Recipient` of the produced block.

## **Tickers**

Tickers allow developers to build on top of Heroglyph. All your contract needs is to inherit the function `ITickerOperation::onValidatorTriggered`. Then, you connect your contract to your ticker and voila, you are hooked into the Heroglyph Protocol. The only thing missing is a validator using your ticker in their graffiti `#<TICKER_NAME>`.

## **Heroglyph Relay**

Heroglyph Relay is the one receiving the graffiti metadata and executes its logic. It will receive an array of

```go
struct GraffitiData {
	string validatorName;
	string[] tickers;
	uint32[] lzEndpointTargets;
	uint32 mintedBlock;
	uint32 slotNumber; 
	string graffitiText;
	uint32 validatorUUID
}
```

then:

* via Validator Identity, it fetches the address of the validator,
* via Tickers, it fetches the contract to call `onValidatorTriggered` on.

## **Heroglyph Node**

Heroglyph Node is a decentralized Web3 function running a task every 2 minutes. It fetches every block in an epoch, filters out the blocks with invalid graffiti, and then computes the graffiti into the `GraffitiData struct` to finally call the Heroglyph Relay.


# Tickers

A ticker enables the execution of code through graffiti.&#x20;

As for example, the Heroglyphs team launched a game with multiple tickers, allowing people to mint genesis tokens. Visit [Game](/heroglyphs/game)  for more information.

Tickers use the Harberger tax system, which means that nobody truly owns a ticker. In fact, there are two ways to lose access to a ticker as an owner:

1. Deposit reached zero: Tax consumed all your deposit.
2. Hijacking: Someone bought your ticker.

### Create / Update a Ticker

### [Create / Update](/heroglyphs/technical-zone/tickers/create-update)

### Tax

The tax is straightforward: you can set a price for your ticker, indicating the amount you are willing to accept for someone to hijack your ticker. This price must be repaid over the year.

If the tax consumes all your deposit, your ticker will be surrendered to the system, its cost will be set to zero, making it free to be hijacked by anyone.

### Hijack

Your ticker has a 7-day protection against hijack starting from the moment you own it. After that period, anyone can buy it at your set price to take ownership of your ticker.

### Use case

Tickers are permissionless, so anyone can create one at the cost of 0.1 ETH. This can be useful if you want to have a "hidden" ticker that interacts with a contract you desire. This way, if the main ticker is hijacked or surrendered, you can still enjoy its benefits, as yours will remain functional.


# Create / Update

### Create

1. Visit our [website](https://heroglyphs.com/)
2. Click on Tickers (or press **S)**\
   ![](https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2FwtHxlm39TDvpM7xFAnDc%2Fimage.png?alt=media\&token=ff5fa08c-1562-40ef-8353-6928d581610f)
3. Click on Create Ticker (or press **G**) \
   \ <img src="https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2F5O0pME5U8Y95i6I5C95H%2Fimage.png?alt=media&amp;token=35b3962d-ef98-4de2-8115-9085d4f7c3b5" alt="" data-size="original">
4. Config your Ticker\
   ![](https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2F2vgakk8Ct6lxkctBqbEw%2Fimage.png?alt=media\&token=4666650d-469a-4dd8-af06-0010acb56d1f)

### Update your Ticker

1. Visit our [website](https://heroglyphs.com/)
2. Click on Ticker
3. Click on "Your Tickers"
4. Select the Ticker you wish to update
5. Use the option you want to accomplish\
   ![](https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2FtL1MPk2GMFkrUXn6sIrc%2Fimage.png?alt=media\&token=066df4e8-8015-4543-a196-449d09549129)


# Developers

## Install

{% embed url="<https://github.com/HeroglyphEVM/heroglyph-library>" %}

## Implementation

All your contract needs is to inherit the function `ITickerOperation::onValidatorTriggered`. Then, you connect your contract to your ticker and voila, you are hooked into the Heroglyph Protocol. The only thing missing is a validator using your ticker in their graffiti `#<TICKER_NAME>`.

```solidity
import { TickerOperator } from "heroglyph-library/src/TickerOperator.sol";

contract MyTickerOperation is TickerOperation {

  /**
   * @notice onValidatorTriggered() Callback function when your ticker has been selected
   * @param _lzEndpointSelected // The selected layer zero endpoint target for this ticker
   * @param _blockNumber  // The number of the block minted
   * @param _identityReceiver // The Identity's receiver from the miner graffiti
   * @param _heroglyphFee // The fee to pay for the execution
   * @dev be sure to apply onlyRelay to this function
   * @dev TIP: Avoid using reverts; instead, use return statements, unless you need to
   * restore your contract to its
   * initial state.
   * @dev TIP:Keep in mind that a miner may utilize your ticker more than once in their
   * graffiti. To avoid any
   * repetition, consider utilizing blockNumber to track actions.
   */
    function onValidatorTriggered(
        uint32 _lzEndpointSelected,
        uint32 _blockNumber,
        address _identityReceiver,
        uint128 _heroglyphFee
    ) external override onlyRelay {
        //Repay Fee
        _repayHeroglyph(_heroglyphFee);
        
        //Add your logic
    }
}


```

## Fee

Presently, there is **no fee** for executing a ticker. That being said, there is a possibility that later on, heroglyph request each apps to pay a fixed fee for the execution.

### Pay the Fee

There are two approaches to pay the fee, either deposit the ETH directly into your contract, or use a GasPool relationship.

If you create a GasPool, it must uses the [IGasPool](https://github.com/HeroglyphEVM/heroglyph-library/blob/0d8c4785bd8a80d8ba4f188269b0bbaf276bec84/src/ITickerOperator.sol#L9) interface

```solidity
/**
 * @title IGasPool
 * @notice If you have a community // service pool to pay all fee, it must have this interface integrated
 * @dev is the feePayer is not the contract address, it will fallback to calling IGasPool::payTo()
 */
interface IGasPool {
    function payTo(address _to, uint256 _amount) external;
}
```

## Layer Zero

There is a small fee to execute a LZ message, this fee must be paid by your protocol // contract, otherwise the lz message will revert.

## Hook into Heroglyph

To hook your contract, see [Tickers](/heroglyphs/technical-zone/tickers)

## Security

### Repeat Attack

A graffiti can contain multiple tickers, meaning your contract can be called more than once (e.g., someone creating a cheap ticker and connect your contract to it, or simply has your ticker more than once).

Therefore, it's always advisable to protect your code if this behavior is not desired.

```solidity
function onValidatorTriggered(uint32,uint256 _blockNumber,address,uint128) external override onlyAutomate
{
	if (_blockNumber <= latestMintedBlock) revert GhostBlock();
	latestMintedBlock = _blockNumber;
}
```

### Missing Blocks

Heroglyphs ensures that the block number will never be lower than the previously executed block, but it cannot guarantee that all valid blocks are caught.

### Delay & Off-chain data

{% hint style="warning" %}
Heroglyphs is not designed for chance games or RNG (Random Number Generation). You should also avoid "Time-based" distribution token.
{% endhint %}

Heroglyphs processes blocks only at the end of an epoch and handles five blocks every two minutes. So, if a block is created at the start of an epoch, it will usually take about 10 minutes for Heroglyphs to recognize it. If there are ten graffiti blocks in an epoch, it will take about four minutes to process all of them.

### Hijacking

You don't permanently own your ticker; you can lose it if your deposit reaches zero, or if someone decides to buy it at your price. Either way, keep in mind that you can lose your ticker, which will require obtaining a new one and migrating the validators.

If your product offers significant advantages to the ecosystem, please contact the Heroglyphs team. We can create a Ticker Immune to those systems for a period of time.


# Testnet Testing

## Trigger a Graffiti

Call `HeroglyphRelay.executeRelay`. We removed the security on the testnet

{% code overflow="wrap" %}

```solidity
function executeRelay(GraffitiData[] calldata _graffities) external 
    returns (uint256 totalOfExecutions_);
```

{% endcode %}

Where GraffitiData is

```solidity
    struct GraffitiData {
        string validatorName; // validator identity name
        string[] tickers; // tickers in the graffiti, can be empty
        uint32[] lzEndpointTargets; //lzEndpointTargets for each tickers
        uint32 mintedBlock; // block minted
        uint32 slotNumber; // Slot of the block
        string graffitiText; // Graffiti Text -- Only for F-E
        uint32 validatorId; // Validator Id -- Much match the Graffiti ID's validator
    }
```

## Mint $BADGES

If for some reason you want to use badges, you can mint them with

> HeroglyphAttestation.faucet(address \_to)

## Deployed Contracts - Sepolia

<table data-header-hidden><thead><tr><th width="225">Contract Name</th><th>Address</th></tr></thead><tbody><tr><td>NameFilterV1</td><td><pre><code>0xaC5907c4B4B8d34523a02e6421bB84992C058400
</code></pre></td></tr><tr><td>ValidatorIdentityV2</td><td><pre data-full-width="false"><code>0x48bCDb36e473a901527E21eC56bAe930d28C2D4d
</code></pre></td></tr><tr><td>Ticker</td><td><pre><code>0xdD1c1afA241663C6c3Bdb54C5112F0900eFFd52e
</code></pre></td></tr><tr><td>HeroglyphRelay</td><td><pre><code>0x1bAE16B284df79e8562d1bdD9538B2e93a6c40Fc
</code></pre></td></tr><tr><td>HeroglyphAttestation</td><td><pre><code>0xd837D9810a1dC2C45107B3F5C04261C974D2C001
</code></pre></td></tr></tbody></table>


# Contracts

## Mainnets

{% tabs %}
{% tab title="Arbitrum" %}

<table data-header-hidden><thead><tr><th width="255">Name</th><th>Address</th></tr></thead><tbody><tr><td>Ticker</td><td><pre><code>0x886ba951042627A4164E9D5E1C8739A3CD320159
</code></pre></td></tr><tr><td>Identity v2</td><td><pre><code>0x0596847646cFfC159eE60375E218cf120cb942eC
</code></pre></td></tr><tr><td>Identity Router</td><td><pre><code>0x83d55452d95cc914e33bcd43e8c9be1ffe422994
</code></pre></td></tr><tr><td>HeroAttestation (Badges)</td><td><pre><code>0xE1439f74Cd5286Bf28B08978703BEd2068DE4260
</code></pre></td></tr><tr><td>Heroglyph Relay</td><td><pre><code>0xa30cCE750cbE9664A0e46C323Fa2ed5376B25A93
</code></pre></td></tr><tr><td>Name Filtering V1</td><td><pre><code>0xee2b6483b966C7497dd8d4bb183763cdf6fC73aC
</code></pre></td></tr></tbody></table>
{% endtab %}

{% tab title="Depricated" %}

<table data-header-hidden><thead><tr><th width="255">Name</th><th>Address</th></tr></thead><tbody><tr><td>Heroglyph Relay</td><td><pre><code>0x384f025f8B1993584857A305C3b2fE181087ae78
</code></pre></td></tr><tr><td>HeroAttestation (Badges)</td><td><pre><code>0x3554a4ceEf26C7BCAbC75BdE03648B7EC6ce59E3
</code></pre></td></tr><tr><td>Identity V1</td><td><pre><code>0x422116B10872523Efaa9ac16D4bb9868293e87E3
</code></pre></td></tr><tr><td>Ticker</td><td><pre><code>0xC843C7AE45b54d1eB1Cd7EA91Ce3A416F0247150
</code></pre></td></tr></tbody></table>
{% endtab %}
{% endtabs %}

## Testnet - Sepolia

<table data-header-hidden><thead><tr><th width="225">Contract Name</th><th>Address</th></tr></thead><tbody><tr><td>NameFilterV1</td><td><pre><code>0xbD0C16649B772D6AE4f84E8E431fF8ef406fD4A1
</code></pre></td></tr><tr><td>HeroglyphRelay</td><td><pre><code>0x971A5BA868bFc1aB53353793C9CF7D9d387d1b38
</code></pre></td></tr><tr><td>ValidatorIdentityV2</td><td><pre><code>0x9ab2ea36bFccDF6b35b021A07b54e357a29185d5
</code></pre></td></tr><tr><td>Ticker</td><td><pre><code>0x2E3Ce263479481c0FC20C0A74B68A2162E5AbD32
</code></pre></td></tr><tr><td>IdentityRouter</td><td><pre><code>0xfF85f7fD40D064Af13C94225281C088BEEC0C5e3
</code></pre></td></tr></tbody></table>


# Game

The ultimate meme tokens

Heroglyph Game has been launched at the same time as Heroglyph Protocol. It shows the power of the protocol through a mysterious and exciting game.


# How to play

The game works in two steps. We have Genesis Keys that are attached to a Genesis Token. Without the key, you can't mint the token.

## Validator

{% hint style="warning" %}
**Before Starting:**

Entering the game is not free, your Identity will need to hold what we call a Genesis Key to mint a Genesis Token.
{% endhint %}

1. You need to be a valid Heroglyph Validator [Validators](/heroglyphs/validators)
2. Find the Genesis you wish to farm [Genesis Tokens](/heroglyphs/game/genesis-tokens)
3. Transfer the Key into your Identity's receiver wallet
4. Wait for your validator to produce a block

### Redeeming Genesis Token with Badges

Validator receives medal for successfully attesting a block (any blocks). Medals are then converted into badges after claiming. When you have 1 Badges, you can redeem it for a genesis token

1. You need to be a valid Heroglyph Validator [Validators](/heroglyphs/validators)
2. Find the Genesis you wish to redeem upon [Genesis Tokens](/heroglyphs/game/genesis-tokens) and buy the key. **The wallet with the badges need to have to key to redeem.**
3. Redeem

## Non-Validator

{% embed url="<https://paragraph.xyz/@heroglyphs/phase2>" %}

{% hint style="warning" %}
Non-Validator cannot mint the Genesis Tokens
{% endhint %}

### Icedrop

*May the odds ever be in your favor.*&#x20;

For those that minted the Genesis NFT’s, there will be an “Icedrop”. 1% of the total supply is reserved for minters, with claims taking place next month. Jeets will not be eligible. Icedrops are essentially a vested airdrop with a cliff. Additionally, a novel distribution method will be revealed.


# Genesis Tokens

## Genesis List

All tokens are deployed on **Arbitrum**, **Base**, and their **respective chains** (where their liquidity pool is located).

#### How to mint the Key:

Some keys are still mintable on the website in the `mint` menu. If they are fully minted, you will need to buy them on services like Opensea

### MOLANDAK

* **Genesis Token**:&#x20;

  ```
  0xA170Eaa9a74ab4b3218C736210b0421aF35C3c00
  ```
* **Arbitrum Key**:&#x20;

  ```
  0x518AD4c19FeA481f743B8dE33Ff1ec1796f94023
  ```
* **Ethereum Key:**

  ```
  0xe0a6B8751a91Ffe43406BFC7d97c4736aB86f483
  ```
* **Pool**: Arbitrum
* **AMM**: <https://balancer.fi/> \[MOLANDAK <- -> USDT]

### LUEYGI

* **Genesis Token**:&#x20;

  ```
  0xcCF580E697B8bBA73748BA881C1872DD4fB01cdA
  ```
* **Arbitrum Key**:&#x20;

  ```
  0xF5E0DFEf32e0e6dB9882af1750c08e9497459100
  ```
* **Ethereum Key:**

  ```
  0x00155a64C651873FFed663C62FfB0001C6D608F1
  ```
* **Pool**: Avalanche
* **AMM**: <https://app.poolside.party> \[LUEYGI <- -> SAVAX]

### PORIGON

* **Genesis Token**:&#x20;

  ```
  0xC3323b6e71925b25943fB7369EE6769837e9C676
  ```
* **Arbitrum Key**:&#x20;

  ```
  0xE077E5f63C34B611a913B3FCBFADAA3b25991733
  ```
* **Ethereum Key:**

  ```
  0xF6cc130F301C80b8aeBF6651e5376cE9CfE8Da0a
  ```
* **Pool**: Polygon
* **AMM**: <https://balancer.fi/> \[PORIGON <- -> WMATIC]

### OVERPOWERED

* **Genesis Token**:&#x20;

  ```
  0xfe5B10F053871e66a319a57a16CF4e709f51367F
  ```
* **Arbitrum Key**:&#x20;

  ```
  0x84Bc8D2a2c6281F15afC18C896766D64EF93bf02
  ```
* **Ethereum Key:**

  ```
  0x6262f6a2291D61139f319ac81fACbDA506A9e049
  ```
* **Pool**: Optimism
* **AMM**: <https://velodrome.finance/> \[OVERPOWERED <- -> WETH]

### ARBINAUTS

* **Genesis Token**:&#x20;

  ```
  0x836975C507bfF631FCD7FBa875e9127C8A50dBa6
  ```
* **Arbitrum Key**:&#x20;

  ```
  0x6F2Ffdd387f01A0573Ca40628EaCF9dBe5240731
  ```
* **Ethereum Key:**

  ```
  0x384f025f8B1993584857A305C3b2fE181087ae78
  ```
* **Pool**: Arbitrum
* **AMM**: <https://www.poolside.party/> \[ARBINAUTS <- -> USDM]

### 69

* **Genesis Token**:&#x20;

  ```
  0x74262b38609a4155EaB4eEcFDcD0E339Da2cF1b2
  ```
* **Arbitrum Key**:&#x20;

  ```
  0xbcEDcFf31C68B1fb362FaEBe36917B35643DE471
  ```
* **Ethereum Key:**

  ```
  0xA48017630cB10182d70bbc37d38914610a0bAd61
  ```
* **Pool**: Mantle
* **AMM**: <https://merchantmoe.com/> \[69 <- -> mETH]

### ONEPUNCH

* **Genesis Token**:&#x20;

  ```
  0x1F63D0EC7193964142ef6B13d901462d0E5CbB50
  ```
* **Arbitrum Key**:&#x20;

  ```
  0x01d7Ef2ab555C800f0818edfc6A9744B79771DA1
  ```
* **Ethereum Key:**

  ```
  0x571645Df4004217bB625107DD0aaC0c092336727
  ```
* **Pool**: Linea
* **AMM**: [https://pancakeswap.finance/](< https://pancakeswap.finance/>) \[ONEPUNCH <- -> WETH]

### SANICSUPERSPEED \[ Phase 3 ]

* **Genesis Token**:&#x20;

  ```
  0xE2eca013A124FBcE7F7507a66FDf9Ad2e22d999B
  ```
* **Arbitrum Key**:&#x20;

  ```
  0xb8F977f9cb94ca72d71eC6466785605319c83F0C
  ```
* **Ethereum Key:**

  ```
  0x4D7d8e2F51738DD1d59E99d3ab699B5B771269DF
  ```
* **Pool**: Fantom
* **AMM**: ???? \[SANICSUPERSPEED <- -> ???]

### KABOSU

* **Genesis Token**:&#x20;

  ```
  0x9e949461F9EC22C6032cE26Ea509824Fd2f6d98f
  ```
* **Arbitrum Key**:&#x20;

  ```
  0x32E707B2Fa13851Ae5A8D5d610B236aB3ad5687f
  ```
* **Ethereum Key:**

  ```
  0x2bd73234Eb66A45a757787443Ddc24e48C6265E4
  ```
* **Pool**: Base
* **AMM**: <https://balancer.fi/> \[KABOSU <- -> WETH]

### SCRIBES

* **Genesis Token**:&#x20;

  ```
  0x750351a9F75F98f2c2E91D4eDb3BeB14e719557E
  ```
* **Arbitrum Key**:&#x20;

  ```
  0x30dA1A8b1673Db2eEE02c72682097290b11325Fd
  ```
* **Ethereum Key:**

  ```
  0xEF4bD738C869Fa6ffbc9CE2A38cBBD4f30E32c4b
  ```
* **Pool**: Scroll
* **AMM**: <https://ambient.finance/> \[SCRIBES <- -> WETH]

### FRXBULLAS

* **Genesis Token**:&#x20;

  ```
  0x3Ec67133bB7d9D2d93D40FBD9238f1Fb085E01eE
  ```
* **Arbitrum Key**:&#x20;

  ```
  0x1910bFE60B28b751b19Ba1C266674eB61b7e6D2B
  ```
* **Ethereum Key:**

  ```
  0x988287f489027811A115CDFc8eB8e4260990aB2B
  ```
* **Pool**: Fraxtal
* **AMM**: <https://www.ra.exchange/> \[FRXBULLAS <- -> wfrxETH]

### GNOBBY \[ Phase 3 ]

* **Genesis Token**:&#x20;

  ```
  0x1a8805194D0eF2F73045a00c70Da399d9E74221c
  ```
* **Arbitrum Key**:&#x20;

  ```
  0xbc75c6a9021a97c3343DC5c52eA2E13E5F1f852c
  ```
* **Ethereum Key:**

  ```
  0x38Ad57C848d4822bACf8997fb7E3EfaE839df04d
  ```
* **Pool**: Gnosis
* **AMM**: ???

### GARFELDO \[Phase 3]

* **Genesis Token**:&#x20;

  ```
  0x344C796cc2474e4b779D0e81765AFB91D7741a42
  ```
* **Aribtrum Key**:&#x20;

  ```
  0x7d35995Ec68BcA71849068e0FC91EB75641c9aA8
  ```
* **Ethereum Key:**

  ```
  0x266392EAF7AE4358bd74b3215BcA1860D64EbCb6
  ```
* **Pool**: Base
* **AMM**: ??? \[GARFELDO <- -> ???]

### OOGABOOGA

* **Genesis Token**:&#x20;

  ```
  0x4e6b45BB1C7D11402faf72c2d59cAbC4085E36f2
  ```
* **Arbitrum Key**:&#x20;

  ```
  0xC38F5a1aA46853Be3BfbFcF00562E01856867ba7
  ```
* **Ethereum Key:**

  ```
  0xB4db8A6B356eea6B0B182878849094f63028533c
  ```
* **Pool**: Arbitrum
* **AMM**: <https://balancer.fi/> \[OOGABOOGA <- -> USDC]

### BIGBANG \[ Phase 3 ]

* **Genesis Token**:  ???
* **Arbitrum Key**:&#x20;

  ```
  0xf4E131ba5E4678bd00e8DBd508f5820fE453A51D
  ```
* **Ethereum Key:**

  ```
  0x8d6B05527e8f6B421C44B96585a1d4F8C1767f90
  ```
* **Pool**: ???
* **AMM**: ???


# Obelisk

**Obelisk** is a lighter version of Heroglyphs. It uses a similar principle but is designed for NFTs, inspired by the Hashmask renaming system. Users can "wrap" any approved collection and rename their NFT to participate in Obelisk.

## Concept

The idea behind Obelisk is simple: The community decides which collections Obelisk should support. Then, users can permanently support these collections by depositing ETH into them. When a collection reaches 100 ETH, it becomes active, and users can wrap their NFTs into ObeliskNFTs.

All ETH deposited is stored in a liquidity pool, where it earns interest. The interest is then distributed to Megapools.

## How It Works

Your NFT's name acts as a command for the protocol. Naming an ObeliskNFT involves two key partsT: your Identity (1) and your Ticker (2).

1. **Identity**: ObeliskNFT needs an identity called **NFTPass**. See this as an EVM to redirect a name to an address
2. **Ticker**: Tickers are like farming pools. Having a ticker is similar to staking in a farming pool.

You can rename your NFT as an ObeliskNFT by paying 90 HCT (Heroglyph Name Change Token). This token can be bought from the liquidity pool or earned by farming HeroNFTs.


# Overview

## Obelisk Structure

There are seven important modules in Obelisk that you should know about:

1. **Obelisk Registry**
2. **Reserve**
3. **Interest Manager / Gauge**
4. **Megapool**
5. **NFTPass** (your identity)
6. **Obelisk NFT** (Wrapped NFT)
7. **Tickers**

### Obelisk Registry

The **Obelisk Registry** is the main module of Obelisk. You’ll use this module to:

* Support the Reserve (see below for more details).
* Contribute to enabling a collection.
* Claim rewards for your contributions.

The core idea of Obelisk is "Let the community decide." Through UMA, the community votes on which collections to allow in the system. Once a collection is approved, users can contribute to it. To enable a collection, the community must contribute 100 ETH, which will be permanently locked in the Reserve. Once the collection reaches 100 ETH, it will create an Obelisk NFT Version.

### Reserve

The **Reserve** is where all ETH received from the protocol is locked permanently to generate yield. You can also support the Reserve by locking your ETH for 30 days, but your ETH will not be locked forever. There are no direct rewards for supporting the Reserve.

The yield generated from the Reserve is managed by the **Interest Manager**.

### Interest Manager / Gauge

The **Interest Manager** collects all the yield generated by the Reserve. It then uses a **Gauge System** powered by Snapshot.org to distribute this yield among **Megapools**.

### Megapools

**Megapools** are the only pools in the system that can receive ETH from the Reserve. Each Megapool can hold up to 1,000 staked NFTs. However, users can create new Megapools by using their **HCT** (Heroglyph Change Token).

When choosing a pool, remember that the most popular pools will receive more ETH.

Obelisk starts with one Megapool called **Senusret**.

### NFT Pass

To participate in Obelisk, you need an identity called an NFT Pass. Think of it as an ENS (Ethereum Name Service) for NFTs. With your NFT Pass, you set a unique name and link it to your wallet address. Once you've done this, you have your NFT Pass. You only need one NFT Pass; there's no need for multiples.

Without an NFT Pass, you won't be able to configure your **Obelisk NFT** or join any **Tickers**.

It's important to keep your NFT Pass name short, as you’ll be limited in how many characters you can use later on. Each byte counts.

An NFT Pass is not needed for **Hashmask** users since they are automatically integrated into Obelisk.

See the [Hashmasks](/obelisk/overview/hashmasks) for more details.

### Obelisk NFT

An **Obelisk NFT** is a wrapped version of any NFT in the system, created by converting an existing NFT into an ERC721 token that interacts with Obelisk.

To wrap your NFT into an **Obelisk NFT**, you need to approve the NFT for wrapping. Once wrapped, your NFT becomes an **Obelisk NFT Version**.

This new version allows you to change the name of the NFT by using special characters to interact with Obelisk’s **Tickers**.

#### **Injecting Your Identity in the Obelisk NFT Name**

You can add your **NFT Pass** identity to your **Obelisk NFT** name using the **@** symbol.

For example, if your NFT Pass is **P**, your name would be: `@P`

#### **Injecting Tickers into the Obelisk NFT Name**

You can also add **Tickers** to your NFT’s name using the **#** symbol to indicate which pools you’re joining.

For example, if you want to join the pools **Senusret**, **SANC**, and **KBSU**, your name would be: `#Senusret,SANC,KBSU`

So, your full NFT name would look like this: `@P #Senusret,SANC,KBSU`

This means that the wallet with NFT Pass **P** has staked in the **Senusret**, **SANC**, and **KBSU** pools.

### Tickers

**Tickers** are similar to NFT Passes, but for pools instead of individual wallets. Only the contract owner can create **Tickers**, so you can think of a Ticker as an **ENS** for pools, rather than for user wallets.

You can view the list of available **Tickers** on the Obelisk website.


# Hashmasks

{% hint style="warning" %}
Please, read the [Overview](/obelisk/overview) before proceeding.
{% endhint %}

{% hint style="danger" %}
**Important:** Once your Hashmask is linked, do not change its name or transfer it **BEFORE** claiming your rewards. Failing to do so might result in the loss of your rewards.

* If you have already transferred your Hashmask, you may transfer it back **only** if no new linking has occurred.
* If you have changed the name, change it back to what it was before **only** if the `updateName`function hasn't been called.
  {% endhint %}

**Hashmasks** is the only collection directly integrated with Obelisk.&#x20;

As a Hashmask user, you do not need to:

* Own an NFT Pass
* Wrap your Hashmask
* Use HCT

Your experience as a Hashmask user will differ slightly. Instead of renaming an Obelisk NFT, you’ll **link***(0.1 ETH)* your Hashmask to Obelisk as **Proof of Ownership**. After linking, you will rename your Hashmask directly using a different syntax.

{% hint style="info" %}
To optimize the number of transactions, it is recommended to rename your Hashmask **before** linking. This will allow you to skip the "UpdateName" step.
{% endhint %}

### Name Syntax

You do not need an NFT Pass, so there is no `(@<NFT_PASS_NAME>)`.\
For tickers, instead of using `#`, use a capital "O", and separate them with spaces instead of commas.\
For example, based on the [Overview](/obelisk/overview#obelisk-nft), your Hashmask would look like this:\
`<UNIQUE_TEXT> OSenusret OSANC OKBSU`

{% hint style="info" %}
The name of your Hashmask **MUST BE UNIQUE**, no two Hashmasks can have the same name. By using the **prefix** field, you can add your ID or an extra character to make it different than any other Hashmask.
{% endhint %}

Once your name has been changed, make sure to update it on the Obelisk side through our website.

### Nice to know

If you transfer your Hashmask, a new Proof of Ownership must be established. Instead of paying 0.1 ETH again, you can transfer your link to the new holder. However, the new holder must have the Hashmask NFT in their wallet before calling this function; otherwise, the transaction will revert.


# HCT

Herolgyphs Name Changing Token

## Contract Address

0xc597a71a49c49b4a0554b3110bab25a51c76847b\
<https://etherscan.io/address/0xc597a71a49c49b4a0554b3110bab25a51c76847b>

### LP Pool

<https://balancer.fi/pools/ethereum/v3/0xb34f21e74562e66cddd96da8e8c229bd64ac4e43>

## Usage

HCT can be used for the following:

* Gauge Voting
* Changing the Obelisk NFT name
* Creating a Megapool

## Tokenomics

We pre-minted 250,000 HCT tokens. Of these, 7,290 HCT were taken from the **Emission / Community**  and sent to the Early Beta Testers inside the community.

* &#x20;**Pre-mint Total**: 250,000
* **Reserved Emissions (75.8%)**: 189,500
* **Team (12.5%)**: 31,250
* **Supporters (7.5%)**: 18,750
* **LP Pool (4%)**: 10,000
* **Heroglyphs HCT Ticker (0.2%)**: 500
* **Max Supply**: Unlimited

## Minting

HCT is generated at a rate of 1 HCT per Obelisk NFT per day. Once the total supply reaches 1,000,000 HCT, the daily rate will decrease to 0.02 HCT per Obelisk NFT.


# Cost / Fee

Before joining Obelisk, it's important to understand the costs involved. Since the protocol is built on Ethereum, you should also be aware of gas fees. Transactions can range from $15 to $150+, depending on network conditions.

## Fee - Overview

| Type        | Activating                           | Wrapping                           | Naming Cost                           |
| ----------- | ------------------------------------ | ---------------------------------- | ------------------------------------- |
| Obelisk NFT | 0.05 ETH - One time global (NFTPass) | 0 or 0.1 ETH - One time per NFT ID | <p>90 HCT <br>(Obelisk Token)</p>     |
| Hashmask    | 0.1 ETH - Linking                    | N/A                                | <p>1,830 NCT <br>(Hashmask token)</p> |

### Obelisk NFT

{% hint style="warning" %}
Wrapping an NFT doesn’t automatically grant you 90 HCT, so you won’t be able to name your Obelisk NFT right away. You’ll need to either buy HCT from the pool or wait until you’ve earned enough.
{% endhint %}

Wrapping an NFT into an Obelisk NFT may incur a cost. When a collection is approved and converted into an Obelisk NFT, the contract performs two actions:

1. **Determine the number of free slots available**\
   The contract calculates 25% of the current supply of the collection and sets that number as free slots.
2. **Assign free slots to odd or even NFT IDs**\
   The contract randomly decides whether the free slots will apply to odd or even NFT IDs. Only NFTs with the selected ID type (odd or even) can access the free slots.

Once the free slots are used up, all NFTs (whether odd or even) will need to pay for their own slot.

{% hint style="success" %}
Once an NFT ID is assigned a slot, any future wrapping of that ID will be free of charge.
{% endhint %}

### Hashmask

Each Hashmasks NFT must be linked to Obelisk for a fee of 0.1 ETH. If the linked NFT is transferred, the new owner must pay the linking fee. However, this fee can be waived if the previous owner uses the "transferLink" feature. \
\
This process is called "Proof of Ownership."

## Fee - Ownership

* NFT Pass -> Obelisk's Treasury&#x20;
* Linking -> Obelisk's Treasury
* Wrapping -> Collection Activation's Contributors & Obelisk's Treasury


# Video Walkthru's

Explainer videos to guide Heroes through their journey

### Obelisk Walk-thru's

***

**Minting an NFT Pass**

{% embed url="<https://www.youtube.com/playlist?list=PLRfbSEXvLizuuYckNB1C6qxk5VrGfSiPd>" %}

***

**Wrapping Eligible NFTs**

{% embed url="<https://youtu.be/xVFBYkRxHto?si=H7LTHnmFTU4PQPrf>" %}

***

Inscribing Graffiti into Eligible NFTs

{% embed url="<https://youtu.be/uYFQcJZxF2o?si=yP64DgXtyCQJPY1p>" %}

***

**Hashmask Linking and Graffiti**

{% embed url="<https://youtu.be/i8H8p50SmJM?si=VhUrLXopaFYi1Q3K>" %}

***

**Claiming Obelisk Rewards**

{% embed url="<https://youtu.be/dpiNpR7mS5I?si=g2PMqKQKH1QwPEtj>" %}

***

***

***

### Genesis Keys and Icedrop Walk-thru's

***

#### Claiming Icedrop from Genesis Keys&#x20;

{% embed url="<https://www.loom.com/share/27b01c35debc4f66a0f265b20c04d7ef>" %}

***

#### Bridging Genesis Keys from Arbitrum to Ethereum Mainnet

{% embed url="<https://www.loom.com/share/31049ebe103e4f5bbf5a270eabfe2f67?sid=3623c214-6fbb-4c8b-be9d-6419e27a543a>" %}


# Contracts

{% hint style="warning" %}
The NFT Pass is not verified due to a bug we're currently facing. The bytecode doesn't match the transaction bytecode, even though nothing has changed.

We tried redeploying the contract to verify it again, but the issue persists. Our auditor has confirmed that the deployed contract is the same as the audited version, and the one on GitHub.

\
Sorry for the inconvenience
{% endhint %}

<table><thead><tr><th width="237">Contract</th><th>Address</th></tr></thead><tbody><tr><td>Name Filter</td><td><pre data-full-width="true"><code>0xC07c742935c8c19ecBcEe3b3c0b992A96e069d14
</code></pre></td></tr><tr><td>NFT Pass</td><td><pre data-full-width="true"><code>0xC88d37B7ae9b6d781678Cf12155A69d6d4Eb82F2
</code></pre></td></tr><tr><td>Apx ETH Vault</td><td><pre data-full-width="true"><code>0xCb6DFd06973bF66C8bD2779538e5C8311B8070B8
</code></pre></td></tr><tr><td>Dai Vault</td><td><pre data-full-width="true"><code>0x90A8E18c1B382Fc59009c24081Ac58E28b86311b
</code></pre></td></tr><tr><td>Obelisk Registry</td><td><pre data-full-width="true"><code>0x8416c04998F4bc5D34e3f817e1A581C8077d5A94
</code></pre></td></tr><tr><td>HCT</td><td><pre data-full-width="true"><code>0xc597a71A49C49b4A0554B3110bab25A51c76847b
</code></pre></td></tr><tr><td>Obelisk Hashmask</td><td><pre data-full-width="true"><code>0x59DeC9058e8c234cDf6FdAa9790C4BE813f02d25
</code></pre></td></tr><tr><td>Interest Manager</td><td><pre data-full-width="true"><code>0xd2B6d1F0d5671E21aeE69F87BcF56eb26F6C6F68
</code></pre></td></tr><tr><td>Streaming Pool</td><td><pre data-full-width="true"><code>0xee81a629A6b52Fa0aFb85cBa3273e5cB832A4051
</code></pre></td></tr><tr><td>Megapool Factory</td><td><pre data-full-width="true"><code>0x90F8F3c2D55dff183b8904F23a3AC8e59AD5b24c
</code></pre></td></tr></tbody></table>


# FAQ

## Collections & Obelisk NFTs

**Q: How can I add a new collection to Obelisk?**\
**A:** Obelisk uses [UMA](https://uma.xyz/) as a Data Asserter. Anyone can add a new collection, but there is a trust process to ensure the information provided is valid.

**Q: How do we activate a collection so it has its own Obelisk NFT version?**\
**A:** After the collection is approved, the community must collectively deposit 100 ETH. Those who contribute are called "Contributors."

**Q: What happens to the 100 ETH?**\
**A:** The 100 ETH is locked permanently in a liquidity staking protocol called [Dinero](https://dinero.xyz/), generating yield indefinitely.

**Q: What happens to the yield generated by the locked ETH?**\
**A:** The yield is directed to our Gauge system, which allocates it to megapools based on community votes. 100% of the generated yield goes to Obelisk.

**Q: Why should I become a contributor to a collection?**\
**A:** Contributors have the potential to receive up to 2.5x their deposit, although there are no guarantees. The more NFTs are wrapped and paid for, the higher the potential return for contributors.

**Q: What’s the Obelisk NFT Multiplier?**\
**A:** The multiplier determines how much of the HCT generated you’ll receive. The higher your multiplier, the more HCT you get. The multiplier is based on the collection’s age, capped at 3x.

## HCT

**Q: Where can I get HCT?**\
**A:** You can obtain HCT either from a liquidity pool (LP) or by owning an Obelisk NFT with multipliers.

## Hashmask

**Q: Why is it possible to lose rewards?**\
**A:** Since Hashmasks are not staked in our contract, we had to create workarounds to enable reward earning. To prevent exploitation, we’ve implemented stricter claiming requirements.

**Q: What happens to the lost rewards?**\
**A:** Lost rewards are returned to the pools and redistributed.


# Seba

### Why Seba?

Seba exists to make solo validating more attractive and to steer validators away from centralized staking solutions. By offering perpetual yield in exchange for temporarily foregoing execution rewards, Seba incentivizes solo validators to participate in a long-term, sustainable ecosystem.

### Protocol Overview

Seba is a protocol inspired Heroglyphs that enables perpetual yield for solo validators.\
Validators who opt into the Seba Pool agree to forego their execution rewards for a set graduation period. In return, once the graduation period ends, they receive perpetual yield proportional to:

* The amount of ETH staked
* Their attestation score during the pool period\
  ​

The yield is paid in the form of **sBOLD** tokens.

Extra boosts are available for aligned validators with the <mark style="color:green;">Seba Boosts</mark> program, increasing their rewards significantly. After graduating, validators may opt out of the protocol while still retaining their perpetual yield benefits.

Missing attestations lowers a validator's share which ensures an ecosystem focused on good performance of all participants.

<figure><img src="https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2FvtLcqVW5qu1cDRA5CRcn%2FSebaPoolDiagramv3%20(1).png?alt=media&amp;token=9dfcc5e2-261c-4956-854a-60f3d1ecfef1" alt=""><figcaption></figcaption></figure>


# Core Concepts

### Solo Validator Participation

Solo validators register their validator IDs with the SebaPool contract through the Seba platform. After this, they must point the fee address of their validators to the SebaPool contract. This begins a graduation period of six months.

During this period, they must keep the fee address set to the SebaPool and perform certain duties. Failing to do so will cause the graduation period to reset to 0 again, effectively restarting the process for the affected validator. If execution rewards go to any address other than the pool, the graduation timer will also reset.

### Perpetual Yield

Once a validator graduates, they receive a share of the protocol’s ongoing yield forever. The yield is paid as sBOLD, backed by locked principal from execution and MEV rewards.

### Boosts for Aligned Validators

Seba offers a <mark style="color:green;">0.5x - 2.5x</mark> reward boost to aligned validators:

* **Stakers Union Members - 2.5x:** Must hold the Stakers Union POAP in their reward address (Ethereum Mainnet or Gnosis Chain).
* **Kamisama NFT Holders -2.5x :** Must hold the NFT in the reward address for the duration of participation. Ownership is checked every epoch.
* **100 Heroes NFT - 2.5x:** Must hold the NFT in the reward address for the duration of the participation. Ownership is checked every epoch.
* **Hero Socks POAP - 0.5x:** Must hold the Hero Sock POAP in their reward address (Ethereum Mainnet or Gnosis Chain).


# Protocol Architecture

### Main Structure

Seba integrates smart contracts and backend services to manage validator participation, monitor performance, and allocate perpetual yields.

### SebaPool Contract

The SebaPool contract serves as the entry point, managing validator registration, tracking graduation, and collecting rewards. Validators join by setting their fee address to the SebaPool contract, directing their execution and MEV rewards into the system.

Collected rewards are split:

* Half are locked in the Yield Vault as principal to generate perpetual yield
* The rest are converted into sBOLD and sent to the pybSeba Vault for distribution

> BOLD is the decentralized, over-collateralized stablecoin issued through the immutable smart contracts of the **Liquity v2** protocol. **sBOLD** is a staked, yield-bearing token, representing deposits that continuously accrue yield from underlying collateral. It allows users to keep their capital productive while maintaining full onchain liquidity, composability, and trustless access across DeFi.\
> \
> **sBOLD:** [0x50Bd66D59911F5e086Ec87aE43C811e0D059DD11](https://etherscan.io/token/0x50Bd66D59911F5e086Ec87aE43C811e0D059DD11)

The current SebaPool contract is: [0xe3B17b4533b339d3CBC26F57199d3fb937129894](https://etherscan.io/address/0xe3b17b4533b339d3cbc26f57199d3fb937129894)

### How Is Everything Tracked?

A backend service executes every five epochs to update validator statistics, save them to AWS S3, and retrieve data from Alchemy, Beaconchain, and Seba’s Subgraph. Blockchain transactions are secured through wallets managed in AWS Secrets Manager.

### How do you check for Stakers Union validators?

We verify Stakers Union NFT ownership on both Ethereum and Gnosis chains.

### Yield Strategy

Yield strategy decisions start under multisig control and will move to DAO governance, with a target of <mark style="color:green;">10% APY on locked principal.</mark>


# Participation

### How does the Participation Workflow?

The process starts when a solo validator registers their validator ID in the SebaPool contract and updates the validator’s fee address to point to this contract. This action immediately begins the graduation period, which is currently set to six months (measured in epochs).

* During this period, the validator must correctly set the fee address and uphold strong attestation performance.

Participating in Seba is designed to be straightforward but relies on consistent validator performance and adherence to protocol rules. Failing to link the fee address to the Seba pool will reset the graduation period and attestation score to zero, requiring the validator to restart the entire process. The protocol enforces these rules strictly because they help maintain fairness among all participants and ensure yield sustainability.

The validator’s withdrawal address - or a registered reward address - receives pybSeba shares representing their perpetual yield entitlement.

### What Happens Once the Graduation Period ends?

After successfully completing the graduation period, the validator does not automatically receive their shares. Instead, they must be included in a valid Heroglyphs block proposal as a ticker associated with their validator ID, starting with the prefix 'seba'. Additionally, the **block reward of this block** should go to the Seba pool.

For example, if your validator ID is <mark style="color:green;">888888</mark> then the correct ticker to be used as part of the proposed block should be '<mark style="color:yellow;">seba</mark><mark style="color:green;">888888</mark>'

### Validator Configuration

If you are the validator proposing the Heroglyphs block, use the following format in your validator's configuration to add one or multiple tickers to the proposed block graffiti field:

* <mark style="color:yellow;">#YourValidatorID</mark> +,+ <mark style="color:green;">ticker1</mark> +,+ <mark style="color:green;">ticker2</mark> ...

Graffiti Example: <mark style="color:yellow;">#seba123456</mark>,<mark style="color:green;">seba999999</mark>,<mark style="color:green;">seba888888</mark> (notice there are no spaces)

> **NOTE**: The graffiti in a valid Heroglyphs blocks must start with #, as shown in the example above.&#x20;

On the client side of your validator, you should configure the fee address to the SebaPool contract: [0xe3...9894](https://etherscan.io/address/0xe3B17b4533b339d3CBC26F57199d3fb937129894)


# SebaPool

### What is the Seba Pool?

\
The Seba Pool functions as the coordination center for solo validators in the protocol. By pooling execution rewards, Seba can lock part as principal while distributing the rest as ongoing yield to graduates.

### Requirements to Participate

Once a validator chooses to join the pool, they are required to keep their fee address linked to the SebaPool contract throughout the entire graduation period. Any violation of this rule results in a reset of both the graduation timer and attestation points, ensuring that only validators who remain consistently aligned receive rewards.

### Recipient Address

Validators have the option to update their reward recipient address by registering it via the SebaPool contract using their withdrawal address. This offers operators greater flexibility in choosing how and where they receive their rewards. This can be done directly from the Seba front end.&#x20;

### Rewards Boost

The Seba Pool also offers reward boosts for validators who are part of aligned communities to receive a <mark style="color:green;">2.5x reward boost</mark>:

* <mark style="color:yellow;">Stakers Union members with the POAP</mark> in their reward address wallet (checked on Ethereum and Gnosis). Should owners chose to, they can bridge POAP's to Ethereum with the following [guide](https://poap.zendesk.com/hc/en-us/articles/9673605937549-How-Do-I-Migrate-My-POAP-To-Mainnet).
* <mark style="color:yellow;">Kamisama NFT holders</mark>, provided the NFT remains in the reward address throughout participation.
* <mark style="color:yellow;">100 Heroes NFT holders</mark> also qualify, but ownership must also be continuous (checked every epoch).
* <mark style="color:yellow;">HeroSocks POAP holders</mark> also qualify for an extra <mark style="color:green;">0.5x</mark> cumulative boost, making the total possible boost for a user <mark style="color:green;">3.0x</mark> (2.5 + 0.5). Ownership must also be continuous (checked every epoch on Ethereum and Gnosis).

The system checks for continued ownership every epoch.

### Validator Stats

Seba provides an API for transparency, enabling users to access validator stats and block data. The validator stats endpoint allows querying multiple IDs at once, while the block endpoint offers pagination for efficient retrieval of historical data.

### Can you change the reward address?

Yes, you can set your reward address by connecting it with your withdrawal address and signing a transaction to update it.


# Yield

Seba's yield generation system is built to be sustainable, ongoing, and closely linked to validator contributions.

### Yield Manager

Execution rewards earned by participating validators are regularly collected by a backend process (every five epochs). The Yield manager receives 100% of execution rewards and distributes:

* 50% permanently to the Yield Vault to generate yield by converting ETH into a yield-generating asset.
* 50% is converted into sBOLD and sent to the pybSeba vault as rewards for the validators.

> **NOTE:** Currently, the primary yield-generating strategy employed is [Beefy eUSD/USDC](https://app.beefy.com/vault/curve-eusd-usdc). Once the DAO governance is in place, it will be possible to change the yield strategy.
>
> **NOTE:** MEV Rewards are included in execution rewards.

### Supporter Pledge Program

To bootstrap the protocol and increase early participation, Seba offers a supporter pledge program.

* Individuals can pledge ETH for a minimum lock period of 30 days, during which it generates yield in the vault.
* After the lock period, the initial capital can be withdrawn, but any yield generated remains in the system.&#x20;
* All deposits will be converted to the yield-generating asset, so will roughly follow the USD value at the moment of deposit. Capital will be returned in ETH denominated in USD value upon deposit

> **NOTE:** Shareholders can burn shares to claim yield in perpetuity. <mark style="color:red;">If all shares are burned</mark>, this user can never claim any rewards again unless they opt in again with a new validator to earn shares.


# Graduation

Graduation is the key milestone for a validator in the Seba protocol. It signifies the shift from active participation to continuous reward collection.

A validator graduates after meeting <mark style="color:green;">two key conditions</mark>:

1. Completing the entire graduation period without violating fee address requirements and with strong attestation performance.
2. Include the validator ID as a ticker in a valid <mark style="color:yellow;">Heroglyphs</mark> block graffiti (e.g., #seba12345) after the validator's graduation period has ended and make sure the **execution reward of the block** goes to the Seba pool.

### Graduation Rewards

Graduation rewards come in the form of shares in the <mark style="color:green;">pybSeba</mark> Vault:

* The number of shares is determined by the validator’s total attestation rewards during the period, multiplied by any applicable boost factor (up to 3.0x).
* The calculation accounts for effective balance, meaning validators with more staked ETH earn proportionally more shares. However, missed attestations reduce the total, promoting optimal performance.

### Can a Validator ID Graduate multiple times?

Graduation occurs only once per validator ID. After graduating, a validator cannot gain more shares for that ID, but they can start a new validator and join again.


# Vault System

The vault system in Seba guarantees fair yield distribution and promotes long-term engagement.

### How does it work?

Before the first graduation, the Yield Vault compounds all yield to maximize growth. After the first graduation event, the vault switches modes:

* Capturing yield every five epochs and sending it to the pybSeba Vault for distribution.
* Allowing shareholders to claim their portion of sBOLD by burning shares in proportion to the claim amount.

This dynamic creates an interesting strategic decision for graduates:

* Claim early and secure a portion of the initial rewards.
* Hold shares and enjoy a continuous stream of yield, which could increase as more validators participate over time.

### Total Number of Shares

The total number of shares is capped based on the total shares ever created for graduated validators.


# Rocket Pool

Seba now supports Rocket Pool (RP) validators, allowing RP node operators to register their **Minipools** directly in Seba!

### What are Minipools?

Minipools are Rocket Pool's version of a validator where the node operator does ***not*** need to contribute the full 32 ETH stake normally required to have a validator. Instead, users are able to stake a partial amount (either 8 ETH or 16 ETH), and the remaining ETH is provided by Rocket Pool users through the purchase of their **rETH** liquid staking token.

Rocket Pool supports two types of Minipools:

* 8 ETH Minipool
* 16 ETH Minipool

### How Minipools Work in Seba

#### Attestation Points

RP validators registered in Seba earn attestation points <mark style="color:green;">**proportional**</mark> <mark style="color:green;">**to their personal stake**</mark>:

* 8 ETH Minipool: earns 25% of a normal validator’s attestation points

  *(32 /* *8 = ¼ = 25%)*
* 16 ETH Minipool: earns 50% of normal attestation points (*32 / 16 = ½ = 50%)*

#### TVL Contribution

Thinking about how Rocket Pool works, even though the Node Operator only Stakes <mark style="color:green;">8 or 16 ETH</mark> within Rocket Pool, **the full 32 ETH validator weight still counts towards Seba's TVL.** &#x20;

### Execution Rewards&#x20;

Normal validator within the Seba app must points their fee recipient to the Seba contract address. Rocket Pool validators cannot do this unless they opt into specific RP punishment modes which of course is not optimal. This led to the creation of a dedicated '**Back-Paying**' contract to handle this situation ([0xDF...E9E5](https://etherscan.io/address/0xDF5fff71608095e6eD34e582C1B7eBD0c5A9E9E5)).


# Back-Paying Execution Rewards

### Back-Paying Execution Rewards

RP validators must back-pay part of their execution rewards to Seba (doable within the Seba app). We created a dedicated contract to allow RP validators to do so:

**Contract:** ([0xDF...E9E5](https://etherscan.io/address/0xDF5fff71608095e6eD34e582C1B7eBD0c5A9E9E5))

### Payment Requirements

Any RP validator registered on Seba which receives execution rewards must back-pay the appropriate share within 3375 epochs (\~15 days).

**Required payment amounts:**

* **8 ETH minipool:** pays 25% of received execution rewards
* **16 ETH minipool:** pays 50%

### How to Pay

Whenever a user has already signed up any Rocket Pool validators, these would appear together with a <mark style="color:yellow;">RP Tooltip</mark> under their personal validator stats when the related wallet is connected. Upon hovering on this tooltip, the user is able to see different types of information such as:

* The RP Minipool worth (8 or 16 ETH)
* How much have they paid in total Back-Pay towards that validator

If the validator requires a payment:&#x20;

* The amount to be paid and the exact amount of time available to back-pay before there is a penalty are available as well.
* A button saying 'Edit Payback' will show up within the tooltip which, when clicked, copies that pay back amount and validator ID into the input fields located under this section.  &#x20;

Wether the values are entered manually or added into the 'Edit Payback' section via the use of the button mentioned above, in this section the user can write down exactly how much they would like to pay towards a certain validator ID and add it to their cart.

Once it has been added to the cart which will show up below, the user can choose to add more validators, edit the pay back amount of a certain ID or remove it from the cart entirely. Take a look at the total and proceed to do the transaction.&#x20;

<figure><img src="https://722457140-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLxn2xdkLrgALvYnuDTh7%2Fuploads%2FMXcrXjsfxBjZhyxESGnn%2Fimage.png?alt=media&amp;token=03488a06-f2c8-4fe3-9733-eca36d8234ee" alt=""><figcaption><p>This is the whole Payback section within the Seba app </p></figcaption></figure>

#### Penalty for Not Paying

If the required back-pay is not completed within 3375 epochs (\~15 days):

* The validator’s attestation points are <mark style="color:red;">reset to zero</mark>
* Their graduation period <mark style="color:red;">resets to zero</mark>

#### Optional: Paying Upfront

* Validators *may* back-pay Seba early to avoid timing issues.
* Payments do not need to come from the RP node address—any wallet may pay on their behalf.


# Important Notes

### Strong Recommendation About Smoothing Pool

RP validators who opt into Seba are strongly advised <mark style="color:red;">NOT</mark> to opt into the Rocket Pool Smoothing Pool and should instead receive execution rewards via the RP distribution contract.

This is not enforced but highly recommended for two reasons:

#### 1. “Lucky Block” Risk

If a validator proposes a block with a large execution reward:

* The smoothing pool spreads the reward across many participants
* The validator loses direct access to the reward
* But Seba still expects their share of back-pay

This may result in the validator needing to pay more than they actually receive.

#### 2. Smoothing Pool Withdrawal Delay

* Smoothing pool rewards unlock every 28 days
* Seba requires back-pay within 15 days

This means validators using the smoothing pool may be forced to pay upfront out of pocket.

It is strongly advised to use the RP Distributor Contract instead of the RP Smoothing pool for these reasons. Please keep this in mind!


# APIs & Data Access

Seba offers robust API endpoints for developers and participants to query validator and protocol data.

### Validator Stats Endpoint

Allows batch retrieval of performance data for multiple validator IDs via a comma-separated query parameter.

**Example:**&#x20;

[https://dp32uxbkno310.cloudfront.net/validator-stats/?validators=1062282,1062287,1062281​](https://dp32uxbkno310.cloudfront.net/validator-stats/?validators=1062282,1062287,1062281%E2%80%8B)

The properties that can be retrieved are the following:

```javascript

export interface TrackedValidator {
 id: number // Validator ID
 attestationPoints: bigint // Number of attestation points accrued
 rewardAddress: string // Validator withdrawal address
 startEpoch: number // Epoch on which the graduation period started
 lastProcessedEpoch: number, // Last processed epoch for this validator
 graduationEligibilityEpoch: number, // Epoch on which this validator will become eligible for graduation
 successfulProposals: number, // Total amount of succesful proposals since registration
 failedProposals: number, // Total amount of failed proposals since registration
 rewardsContributed: number, // Total amount of rewards contributed to Seba Pool
 graduated: boolean // Wether the validator has graduated
 effectiveBalance: number // Current effective balance
 lastProposedValidGraduationBlockEpoch: number
 /* Last epoch on which a graduation block was proposed for this validator (does not mean a graduation
 will happen automatically because validator needs to run trough complete graduation period as prerequisite) */
}
```

### Block Retrieval Endpoint

Returns blocks associated with SebaPool participation, with support for pagination. Example:

```
https://dp32uxbkno310.cloudfront.net/blocks/?p=0&size=10
```

The properties that can be retrieved are the following:

```javascript
export interface BlockProposal {
    blockHash: string
    blockNumber: number
    timestamp: number
    blockReward: number
    blockMevReward: number
    producerReward: number
    feeRecipient: string
    gasLimit: number
    gasUsed: number
    baseFee: number
    txCount: number
    internalTxCount: number
    uncleCount: number
    parentHash: string
    uncleHash: string
    difficulty: number
    posConsensus: PosConsensus
    relay: Relay
    consensusAlgorithm: string
}
```


# Future Development & Governance

Seba is built to evolve over time. At launch, a multisig will oversee the core yield protocol and strategic settings to maintain stability. As the platform matures, control will shift to a DAO governance structure, allowing the community to vote on yield strategies, boost initiatives, and protocol upgrades.

Future enhancements may include:

* Expanding the list of aligned communities eligible for boosts
* Optimizing backend systems for quicker data processing
* Introducing innovative yield strategies to optimize returns for graduates.


# All Contracts

This is a list of all the current contracts being used within Seba:

<table><thead><tr><th width="266.470703125">Contract Name</th><th>Address  (ETH Mainnet)</th></tr></thead><tbody><tr><td>SebaPool</td><td><a href="https://etherscan.io/address/0xe3B17b4533b339d3CBC26F57199d3fb937129894">0xe3B17b4533b339d3CBC26F57199d3fb937129894</a></td></tr><tr><td>PYBSeba</td><td><a href="https://etherscan.io/address/0x8D06a179486111E556A7C46E49352259B0279CD1">0x8D06a179486111E556A7C46E49352259B0279CD1</a></td></tr><tr><td>YieldManager</td><td><a href="https://etherscan.io/address/0xCAd999958e9619C3E5Bed96B8725Bb0b0fa45269">0xCAd999958e9619C3E5Bed96B8725Bb0b0fa45269</a></td></tr><tr><td>EthToBoldRouter</td><td><a href="https://etherscan.io/address/0x8964C3746b0d1A1BaE5F7f77879b2fE45c45FCA4">0x8964C3746b0d1A1BaE5F7f77879b2fE45c45FCA4</a></td></tr><tr><td>EUSDUSDCBeefyYieldVault</td><td><a href="https://etherscan.io/address/0x87Be53F4E45f3EAFa4b8f2dD8B852115Bb1f16Ba">0x87Be53F4E45f3EAFa4b8f2dD8B852115Bb1f16Ba</a></td></tr></tbody></table>


