Перейти к основному содержанию

Архитектура контракта

Контракт Ownership Token (OT) управляет жизненным циклом проектных токенов, представляющих реальное, юридически обеспеченное владение активами, принадлежащими . Каждый проект разворачивает собственный экземпляр контракта OT на Solana — со своим mint, governance и логикой распределения доходов.

On-Chain аккаунты

OtConfig

Основной PDA конфигурации Ownership Token. Хранит authority DAO проекта, метаданные токена, лимит предложения и ссылки на revenue и governance аккаунты. Seeds: ["ot_config", ot_mint].

OtMint

SPL-токен mint для Ownership Token этого проекта. Mint authority принадлежит PDA OtConfig — только контракт может минтить новые токены. У каждого проекта уникальный mint.

RevenueAccount

Аккумулирует доход, депонированный DAO проекта от реальных операций (аренда, комиссии, роялти). Средства хранятся здесь до распределения согласно RevenueConfig. Seeds: ["revenue", ot_mint].

RevenueConfig

Хранит список направлений распределения с их процентами аллокации. Каждое направление имеет имя, целевой адрес и долю в базисных пунктах. DAO проекта может добавлять, удалять и обновлять направления в любой момент. Seeds: ["revenue_config", ot_mint].

OtGovernance

Хранит параметры governance DAO проекта: пороги предложений, конфигурацию рынков футархии, периоды голосования и текущий governance authority. Seeds: ["ot_governance", ot_mint].

Основные инструкции

initialize_ot

Разворачивает новый Ownership Token для проекта. Создаёт PDA OtConfig, OtMint, RevenueAccount, RevenueConfig и OtGovernance. Устанавливает authority DAO проекта, метаданные токена, лимит предложения и начальные направления распределения.Authority: Деплоер проекта (однократный вызов)
Accounts:
  - deployer:            Signer
  - ot_config:           PDA (init)
  - ot_mint:             Mint (init)
  - revenue_account:     PDA (init)
  - revenue_config:      PDA (init)
  - ot_governance:       PDA (init)
  - system_program
  - token_program

Args:
  - name: String         Имя токена (напр., "AREAL Miami Tower")
  - symbol: String       Символ токена (напр., "AMT")
  - decimals: u8         Десятичные знаки
  - supply_cap: u64      Максимальное общее предложение (0 = без ограничений)
Минтит новые Ownership Tokens указанному получателю. Контролирует лимит предложения, определённый в OtConfig. Обычно используется при первичном распределении токенов или последующих раундах финансирования, одобренных governance.Authority: Governance DAO проекта
Accounts:
  - governance:          Signer (authority DAO проекта)
  - ot_config:           PDA
  - ot_mint:             Mint (mut)
  - recipient_ata:       Токен-аккаунт получателя (mut)
  - token_program

Args:
  - amount: u64          Количество для минтинга
  - recipient: Pubkey    Целевой кошелёк
Депонирует доход от реальных операций в RevenueAccount. Вызывается DAO проекта, когда off-chain доход переводится on-chain (собрана аренда, получены комиссии, поступили роялти).Это автоматически запускает distribute_revenue — как только средства поступают в RevenueAccount, контракт разделяет их согласно предварительно настроенному RevenueConfig и пересылает долю Holders в контракт Yield Distribution. Дополнительное голосование не требуется.Authority: Governance DAO проекта
Accounts:
  - governance:          Signer (authority DAO проекта)
  - revenue_account:     PDA (mut)
  - deposit_source_ata:  Исходный токен-аккаунт (USDC)
  - token_program

Args:
  - amount: u64          Сумма дохода в USDC
Срабатывает автоматически при поступлении средств в RevenueAccount через deposit_revenue. Разделяет депонированную сумму согласно предварительно настроенному RevenueConfig — отдельное голосование для каждого распределения не требуется.DAO голосует один раз — при настройке или изменении RevenueConfig (через add_destination, update_destination, remove_destination). После этого каждый депозит дохода автоматически проходит через настроенные направления.Для направлений типа Holders контракт автоматически вызывает create_distribution на контракте Yield Distribution через CPI — создаётся новый изолированный цикл распределения.С общей суммы распределения удерживается комиссия протокола AREAL 0.25%.Authority: Автоматически (вызывается внутренне из deposit_revenue)
Accounts:
  - revenue_account:     PDA (mut)
  - revenue_config:      PDA
  - destination_atas:    Токен-аккаунты направлений (mut, переменное кол-во)
  - distribution_program: Программа Yield Distribution
  - distribution_stream: PDA stream Yield Distribution (для типа Holders)
  - treasury_ata:        Аккаунт комиссии AREAL DAO
  - token_program
Добавляет новое направление распределения в RevenueConfig. DAO проекта голосует (через футархию) за создание новых потоков дохода — например, маркетинговый бюджет, фонд разработки или новая аллокация команде. Общая аллокация по всем направлениям должна составлять 100%.Authority: Governance DAO проекта
Accounts:
  - governance:          Signer (authority DAO проекта)
  - revenue_config:      PDA (mut)

Args:
  - name: String         Имя направления (напр., "Операционная деятельность команды")
  - destination: Pubkey  Целевой кошелёк или адрес программы
  - share_bps: u16       Аллокация в базисных пунктах (напр., 3000 = 30%)
  - dest_type: enum      { Holders, Wallet, DaoTreasury }
Обновляет существующее направление распределения — изменяет имя, целевой адрес, процент аллокации или тип. DAO проекта голосует за корректировку распределения дохода по мере развития проекта. Общая аллокация после обновления должна оставаться 100%.Authority: Governance DAO проекта
Accounts:
  - governance:          Signer (authority DAO проекта)
  - revenue_config:      PDA (mut)

Args:
  - destination_id: u8   Индекс обновляемого направления
  - name: Option<String>
  - destination: Option<Pubkey>
  - share_bps: Option<u16>
  - dest_type: Option<enum>
Удаляет направление распределения из RevenueConfig. Освободившаяся аллокация должна быть перераспределена между оставшимися направлениями, чтобы сумма оставалась 100%. Нельзя удалить последнее направление.Authority: Governance DAO проекта
Accounts:
  - governance:          Signer (authority DAO проекта)
  - revenue_config:      PDA (mut)

Args:
  - destination_id: u8   Индекс удаляемого направления
Передаёт governance authority DAO проекта новому адресу. Обеспечивает ту же гибкость, что и RWT Engine — проект может быть передан другому DAO, мультисигу или структуре управления.Authority: Текущий authority DAO проекта
Accounts:
  - current_authority:   Signer
  - ot_governance:       PDA (mut)

Args:
  - new_authority: Pubkey
Обновляет параметры конфигурации токена — метаданные, корректировки лимита предложения или параметры governance. Требует authority DAO проекта.Authority: Governance DAO проекта
Accounts:
  - governance:          Signer (authority DAO проекта)
  - ot_config:           PDA (mut)
  - ot_governance:       PDA (mut, если обновляются governance-параметры)

Распределение дохода

Как это работает

DAO голосует один раз за настройку RevenueConfig — задавая направления и проценты. После этого всё автоматически: при каждом депозите дохода в RevenueAccount инструкция distribute_revenue срабатывает немедленно и разделяет средства по предварительно настроенным направлениям. Повторные голосования не нужны.

Структура RevenueConfig

RevenueConfig хранит список направлений — каждое с именем, типом, целевым адресом и аллокацией в базисных пунктах. Сумма всех аллокаций должна равняться 10 000 bps (100%).
ПолеТипОписание
nameStringЧитаемое название (напр., “Держатели токенов”, “Операционная деятельность команды”)
dest_typeenumHolders — пересылка в контракт Yield Distribution; Wallet — прямой перевод; DaoTreasury — казна DAO проекта
destinationPubkeyЦелевой адрес (программа Yield Distribution, кошелёк команды, PDA казны DAO)
share_bpsu16Аллокация в базисных пунктах (5000 = 50%)

Пример конфигурации

1

50% → Держатели OT

Тип: Holders. Контракт OT автоматически вызывает create_distribution на контракте Yield Distribution через CPI — создаётся новый изолированный цикл распределения. Средства размещаются в master pool RWT/USDY через DCA и распределяются посекундно держателям OT в RWT. Дополнительное голосование не требуется.
2

30% → Операционная деятельность команды

Тип: Wallet. Прямой перевод на операционный кошелёк команды. Покрывает зарплаты, обслуживание, управление имуществом и повседневные расходы.
3

20% → Казна DAO проекта

Тип: DaoTreasury. Накапливается в собственной казне DAO проекта для будущего использования — реинвестирование, приобретение активов, углубление ликвидности или экстренные резервы.
Это лишь пример. DAO проекта имеет полную гибкость для создания любого количества направлений с любой аллокацией. Проект может добавить «Маркетинговый фонд» на 5%, уменьшить аллокацию команды или создать направление «Программа обратного выкупа» — всё через голосования governance.

Управление направлениями

DAO проекта может изменять структуру распределения в любой момент через governance:

Добавить

add_destination — создать новый поток дохода. Пример: добавить «Фонд устойчивости» на 10% и пропорционально уменьшить другие аллокации.

Обновить

update_destination — изменить % аллокации, целевой адрес или имя. Пример: увеличить долю держателей с 50% до 60% по мере развития проекта.

Удалить

remove_destination — удалить направление и перераспределить его долю. Пример: убрать временный маркетинговый фонд после завершения кампании.
Все модификации требуют голосования governance DAO проекта (через футархию). Контракт гарантирует, что аллокации всегда в сумме равны ровно 100% — любая инструкция, нарушающая этот инвариант, отклоняется.

Жизненный цикл дохода

Одноразовая настройка конфига (голосование DAO)

DAO голосует (через футархию) за настройку или изменение RevenueConfig — определяя направления и проценты. Это происходит только один раз (или когда DAO хочет изменить пропорции). После этого повторные голосования не нужны.

Генерация дохода

Реальные активы, принадлежащие DAO Ownership Company, генерируют доход — аренда, сервисные комиссии, лицензионные роялти, процентный доход.

On-chain депозит → автоматическое распределение

DAO проекта переводит доход on-chain, вызывая deposit_revenue. Как только средства поступают в RevenueAccount, distribute_revenue срабатывает автоматически — разделяя средства согласно RevenueConfig. Дополнительное голосование не требуется.

Мгновенное исполнение

Каждое направление получает свою долю атомарно: Holders → автоматический CPI в Yield Distribution (новый изолированный цикл запускается немедленно). Wallet → прямой перевод команде. DaoTreasury → накопление для будущего использования. Всё в одной транзакции.

Связь с RWT Vault

Ownership Tokens — это строительные блоки RWT Vault. Strategy authority RWT Vault покупает OT на native DEX для формирования диверсифицированного портфеля.
Контракты OT независимы от контракта RWT. Каждый проект управляет своим токеном, governance и доходом. RWT Vault взаимодействует с OT только через рыночные операции на native DEX — привилегированного доступа или особых отношений нет.

Безопасность

Изоляция проектов

Каждый контракт OT — отдельное развёртывание со своими PDA. Контракт одного проекта не может получить доступ к состоянию или средствам другого.

Контроль предложения

supply_cap в OtConfig контролируется on-chain. После установки не может быть превышен — даже authority DAO проекта.

Инвариант 100%

Контракт гарантирует, что все аллокации направлений в RevenueConfig всегда в сумме равны ровно 10 000 bps (100%). Любая инструкция, нарушающая этот инвариант, отклоняется.

Учёт доходов

Все депозиты и распределения доходов отслеживаются on-chain с полным аудиторским следом. Никакие off-chain посредники не управляют средствами.

Передача authority

Governance проекта может быть передан любому адресу через transfer_ot_authority, обеспечивая прогрессивную децентрализацию или передачу DAO→DAO.

Изменения через governance

Все модификации направлений (add, update, remove) требуют голосования governance DAO проекта. Ни один актор не может перенаправить доход без одобрения сообщества.
Контракт Ownership Token в настоящее время находится в разработке. Эта документация описывает целевую архитектуру. Код контракта ещё не прошёл аудит.