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

# TRUST смарт-контракт

# Смарт-контракт

Смарт-контракт — это программа, которая автоматически исполняет и обеспечивает выполнение заданных условий в блокчейне. Ее код хранится и выполняется прямо в сети, без посредников, по заранее определенным правилам.

# Общая информация

* Блокчейн: [Solana](https://solana.com/)
* Репозиторий: [https://github.com/whalescorp/holders-vesting-sol/](https://github.com/whalescorp/holders-vesting-sol/)
* Язык: [Rust](https://rust-lang.org/)
* Лицензия: [MIT](https://en.wikipedia.org/wiki/MIT_License)

# Блок-схема работы контракта

<img src="https://mintcdn.com/whalescorp/Ev4p22cRFxlmwX97/images/image(3)(1).png?fit=max&auto=format&n=Ev4p22cRFxlmwX97&q=85&s=f5335b5c36df7f9d9b819d41585f4046" alt="Image(3)(1)" width="933" height="740" data-path="images/image(3)(1).png" />

Эта блок-схема описывает процесс создания и использования vesting, а также распределения токенов через блокчейн. Процесс можно разбить на следующие этапы:

1. **Создание vesting:**
   1. Пользователь инициирует создание vesting.
   2. Информация передается в Issuer, а затем в базу данных, где запись сохраняется в статусе `PENDING`.
2. **Деплой контракта:**
   1. База данных уведомляет ChainManager о необходимости задеплоить контракт.
   2. ChainManager инициирует деплой контракта в блокчейне.
   3. После успешного деплоя статус обновляется до `ACTIVE`.
3. **Пополнение депозита:**
   1. Пользователь вносит токены в контракт.
   2. Это действие фиксируется в базе данных.

Дальнейшие действия происходят циклически в зависимости от периода разблокировки:

1. **Распределение токенов:**
   1. Пользователю выплачивается часть токенов.
   2. ChainManager получает из блокчейна информацию о завершении выплаты.
   3. ChainManager уведомляет Issuer о том, что выплата выполнена.

* Issuer передает в базу данных информацию о выплате и обновленном балансе и решает, нужно ли запускать следующий цикл.

# Роли контракта

1. **Config Authority**:
   1. Отвечает за создание и управление конфигурациями vesting.
   2. Имеет право назначать controller.
2. **Controller**:
   1. Участник, который управляет конкретной конфигурацией и может выполнять операции, связанные с vesting.
   2. Может создавать новые vesting и добавлять или удалять beneficiaries.
3. **Grantor**:
   1. Лицо или адрес, который создает конкретный vesting.
   2. Может добавлять beneficiaries и инициировать выплаты.
4. **Beneficiary**:
   1. Получает токены в соответствии с графиком vesting.
   2. Может участвовать в получении токенов при их распределении.

# Основные операции и сценарии

1. **Создание конфигурации, `create_config`** — инициализация новой конфигурации vesting с заданными параметрами, включая configurator и controller.
2. **Смена controller, `set_controller`** — обновление controller для уже существующей конфигурации.
3. **Создание vesting, `create_vesting`** — инициализация нового vesting с определением таких параметров, как время распределения токенов, номинальная сумма и инфляция.
4. **Добавление beneficiary, `add_beneficiary`** — добавляет нового beneficiary в существующий vesting, проверяя, чтобы число beneficiaries не превышало допустимые пределы.
5. **Удаление beneficiary, `remove_beneficiary`** — удаляет beneficiary из списка получателей vesting, при этом проверяется соблюдение минимальных требований по числу beneficiaries.
6. **Запрос токенов, `claim`** — позволяет beneficiary запросить токены в соответствии с условиями vesting, проверяя доступные средства и временные ограничения.

# Расчет инфляции

В структуре `VestingV0` есть поле `inflation_rate_per_interval`, которое отвечает за процент инфляции. Этот параметр позволяет задавать уровень инфляции для заданного интервала.\
Метод `total_release_amount_with_inflation_at` в структуре `VestingV0` вычисляет общее количество токенов, которое может быть выплачено с учетом заданной инфляции:

```
pub fn total_release_amount_with_inflation_at(&self, unix_timestamp: i64) -> Option<u64 {
    let first_release_at = if self.cliff_until == 0 {
        self.started_at
    } else {
        self.cliff_until
    };
    
    if unix_timestamp < first_release_at {
        return None;
    }
    
    let elapsed = unix_timestamp.checked_sub(first_release_at)?;
    let release_count = elapsed.checked_div(self.release_interval)?;
    
    if release_count == 0 {
        return Some(self.nominal_release_amount);
    }
    
    // Логика с учетом инфляции
    // ...
}
```

Метод вычисляет количество интервалов, прошедших с начала vesting, и в зависимости от этого увеличивает сумму с учетом указанной инфляции. Через цикл происходит проход по интервалам и накопление суммы в зависимости от инфляции. Такой подход позволяет динамически рассчитывать размер выплат в зависимости от времени и установленной инфляции, что дает гибкость в управлении финансовыми потоками.

# Структура данных

## Config

* `bump`: используется для обеспечения уникальности аккаунта, это один из механизмов работы с адресами.
* `seqno`: последовательный номер конфигурации.
* `authority`: адрес владельца конфигурации.
* `controller`: адрес контроллера, управляющего конфигурацией.

## Vesting

* `bump`: как и в `Config`, используется для предотвращения коллизий при создании аккаунта.
* `seqno`: последовательный номер vesting.
* `config`: ссылка на аккаунт конфигурации, с которым связан vesting.
* `mint`: адрес токена, для которого создается vesting.
* `grantor`: адрес создателя vesting.
* `beneficiaries`: список адресов получателей токенов.
* `started_at`: время начала vesting в формате Unix timestamp.
* `cliff_until`: момент окончания периода `cliff`, то есть отрезка времени, в течение которого токены еще нельзя получить.
* `release_interval`: временной интервал между выплатами токенов.
* `nominal_release_amount`: номинальная сумма, подлежащая выпуску.
* `inflation_rate_per_interval`: процент инфляции для каждого интервала.
* `total_transferred_amount`: сумма, которая уже была переведена beneficiaries.

# Gas

### Contract Creation and Maintenance

В Holders при создании контрактов в Solana используется [RentExemption](https://solana.com/docs/core/accounts) — это разовый платеж за 2 года, который навсегда резервирует место. Стоимость [RentExemption](https://solana.com/docs/core/accounts) в Solana зависит от размера хранилища, в байтах, и текущей ставки аллокации в сети. В среднем цена составляет примерно 0.0023 SOL за каждые 10 KB. При закрытии аккаунта можно запросить возврат этой стоимости, так как аллокация больше не нужна.\
Примерная стоимость создания такого контракта составляет **около 0.015 SOL, то есть примерно 2 USD при курсе Sol/USDT \$139**.

### Gas for Funding

Чтобы ускорять транзакции в сети Solana, подключен механизм [Priority Fee](https://solana.com/docs/core/fees) — это дополнительная комиссия, повышающая вероятность подтверждения при высокой нагрузке. Это позволяет обрабатывать транзакции быстрее. Пользователь оплачивает gas только при пополнении контракта; все остальные выплаты уже покрываются сервисом. Gas за пополнение счета в Solana фиксирован и составляет **0.000005 SOL, то есть 0.00069 USD при курсе Sol/USDT \$139**.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.