Архитектура контракта
Контракт RWT — это on-chain движок — vault-backed токена, который агрегирует доходность от из всего портфеля AREAL. Контракт развёрнут на Solana и использует MagicBlock Ephemeral Rollups для посекундного начисления доходности в реальном времени.On-Chain аккаунты
Всё основное состояние хранится в -аккаунтах, принадлежащих программе RWT. Это обеспечивает trustless и permissionless доступ к операциям vault.EngineAuthority
Хранит адрес верхнеуровневого authority, контролирующего весь контракт RWT Engine. Этот authority может исполнять все governance-инструкции и может быть передан любому адресу — другому DAO, мультисигу или индивидуальному аккаунту. Seeds:
["engine_authority"].RwtVault
Основной PDA vault. Хранит портфель Ownership Tokens, отслеживает общий инвестированный капитал, общее предложение RWT и текущий NAV Book Value. Seeds:
["rwt_vault"].RwtMint
PDA mint authority для SPL-токена RWT. Только программа vault может минтить новые RWT через инструкцию
mint_rwt. Seeds: ["rwt_mint"].CapitalAccumulator
Буферный аккаунт, хранящий депонированный капитал (USDC и другие одобренные токены) до развёртывания в позиции Ownership Tokens. Получает средства от
mint_rwt и продаж OT. Стратегия исполнения берёт средства из этого аккаунта. Seeds: ["capital_accumulator"].VaultClaimAccount
Собственный ClaimAccount vault в контракте Yield Distribution. Получает посекундные RWT-награды от каждого OT в vault — точно как ClaimAccount обычного держателя. Seeds:
["claim", rwt_vault] (в программе Yield Distribution).YieldAccumulator
Промежуточный аккаунт для yield, забранного из
VaultClaimAccount. Хранит доходность перед разделением в distribute_yield (70% book value, 15% ликвидность, 5% treasury, 10% резерв). Делегирован в MagicBlock ER. Seeds: ["yield_accumulator"].DistributionConfig
Хранит коэффициенты распределения доходности (по умолчанию 70/15/5/10) и ссылки на целевые аккаунты. DAO может обновить эти коэффициенты в любой момент через голосование футархии. Seeds:
["distribution_config"].StrategyConfig
Хранит текущий
strategy_authority, вайтлист OT и ограничения портфеля (макс. размер сделки, лимиты концентрации, правила диверсификации). Seeds: ["strategy_config"].AcceptedMints
Реестр токенов, одобренных DAO для минтинга RWT. Каждая запись связывает mint токена с его ценовым фидом оракла MagicBlock для конвертации в USD. Seeds:
["accepted_mints"].MintGuardians
Список кошельков-хранителей, уполномоченных ставить на паузу/снимать с паузы минтинг RWT для всего контракта. Также хранит текущий флаг
mint_paused. Хранители назначаются DAO — любой один хранитель может активировать экстренную паузу. Seeds: ["mint_guardians"].Целевые аккаунты
Treasury
Получает 5% распределённой доходности. Контролируется AREAL DAO.
Reserve Pool
Получает 10% распределённой доходности. Буфер безопасности, управляемый через Reserve Fund.
Liquidity Pool
Получает 15% распределённой доходности. Направляется в master pools RWT на native DEX.
Основные инструкции
Программа RWT предоставляет следующие инструкции, управляющие жизненным циклом vault.initialize_vault
initialize_vault
Создаёт все основные PDA:
EngineAuthority, RwtVault, RwtMint, CapitalAccumulator, YieldAccumulator, DistributionConfig, StrategyConfig и AcceptedMints. Устанавливает начальный engine authority, коэффициенты распределения и регистрирует начальные принимаемые deposit-минты с их ценовыми фидами оракулов.Authority: Governance multisig (однократный вызов)mint_rwt
mint_rwt
Минтит RWT в обмен на любой токен, одобренный DAO. Вся операция атомарна в рамках одного блока Solana:
- Снапшот NAV — считывает текущий
rwt_vault.nav_book_value(обновляется посекундно циклом доходности в ER) - Конвертация депозита в USD — считывает ценовой фид оракла для не-USD токенов
- Расчёт количества RWT —
rwt_out = net_deposit_usd / nav_book_value - Применение комиссии — 1% (0.5% в Capital Accumulator, 0.5% в DAO)
- Перевод депозита в Capital Accumulator
- Минт RWT на кошелёк пользователя
- Обновление NAV — атомарно отражает новый депозит в
total_invested_capital
mint_paused в MintGuardians — если любой хранитель активировал экстренную паузу, весь минтинг глобально остановлен до снятия паузы.Authority: Permissionless — вызвать может кто угодно (если минт не на глобальной паузе)pause_mint
pause_mint
Экстренная пауза — останавливает весь минтинг RWT глобально. Любой один хранитель из списка
MintGuardians может активировать это немедленно, без голосования DAO. Предназначено для быстрого реагирования на эксплойты, сбои оракулов или рыночные чрезвычайные ситуации.Authority: Любой хранитель из MintGuardiansunpause_mint
unpause_mint
Возобновляет минтинг RWT после экстренной паузы. Минтинг продолжается по текущему NAV Book Value — цена не замораживается на время паузы, она отражает актуальное состояние vault в момент возобновления. Снять паузу может только Engine Authority (DAO) — это гарантирует, что один хранитель не может односторонне возобновить минтинг без консенсуса сообщества.Authority: Engine Authority (DAO governance)
update_mint_guardians
update_mint_guardians
Добавляет или удаляет кошельки хранителей из списка
MintGuardians. DAO голосует (через футархию) за назначение доверенных лиц или организаций, которые могут активировать экстренную паузу минтинга.Authority: Engine Authority (DAO governance)update_accepted_mints
update_accepted_mints
Добавляет или удаляет токены из списка принимаемых deposit-минтов для
mint_rwt. Каждый одобренный токен должен иметь соответствующий ценовой фид оракла MagicBlock. Сообщество DAO голосует (через футархию) за одобрение новых токенов или отзыв существующих.Authority: DAO governance (голосование через футархию)accumulate_yield
accumulate_yield
Забирает накопленные RWT-награды из ClaimAccount vault (в контракте Yield Distribution) и переводит в
YieldAccumulator. У RWT Vault есть собственный ClaimAccount — как у любого держателя OT — и он получает посекундную доходность от каждого OT в портфеле.Выполняется каждую секунду внутри Ephemeral Rollup как часть атомарного цикла доходности.Authority: Permissionless (crank)distribute_yield
distribute_yield
Считывает накопленную доходность из
YieldAccumulator и разделяет её согласно коэффициентам DistributionConfig: 70% зачисляется в book value vault, 15% — в ликвидность, 5% — в treasury, 10% — в резерв.Authority: Permissionless (crank)update_distribution_config
update_distribution_config
Обновляет коэффициенты распределения доходности и/или целевые аккаунты в
DistributionConfig. Сообщество DAO может проголосовать (через футархию) за изменение пропорций распределения — корректируя проценты, добавляя новые направления или перенаправляя потоки в любой момент. Сумма всех коэффициентов должна составлять 100%.Authority: DAO governance (голосование через футархию)update_nav
update_nav
vault_buy_ot
vault_buy_ot
Берёт капитал из Capital Accumulator и выполняет покупку конкретного Ownership Token на AREAL native DEX. Vault маршрутизирует swap через DEX. Вызывается только текущим
strategy_authority.Authority: strategy_authority (governance или AI-агент)vault_sell_ot
vault_sell_ot
Продаёт конкретный Ownership Token на AREAL native DEX и возвращает выручку в Capital Accumulator. Капитал остаётся в накопителе до повторного размещения strategy authority. Вызывается только текущим
strategy_authority.Authority: strategy_authority (governance или AI-агент)set_strategy_authority
set_strategy_authority
transfer_engine_authority
transfer_engine_authority
Engine Authority
Контракт RWT Engine имеет единый верхнеуровневый authority, хранящийся в PDAEngineAuthority. Это корень доверия всего контракта — он контролирует все governance-операции.
Engine authority может быть передан любому адресу в любой момент — что открывает следующие сценарии:
Передача DAO → DAO
Текущий DAO передаёт контроль над RWT Engine другому DAO с иной структурой governance, юрисдикцией или сообществом.
Миграция мультисига
Authority переходит от одного мультисига к другому — например, при ротации членов совета безопасности или обновлении реализации мультисига.
Прогрессивная децентрализация
Старт с мультисига основателей, переход к DAO сообщества, затем к полностью автономному on-chain governance контракту.
Экстренное управление
В случае сбоя governance сообщество может проголосовать за передачу authority доверенной организации или совету безопасности для временного кризисного управления.
Управление портфелем
RWT Vault активно управляет портфелем Ownership Tokens — покупая и продавая их исключительно на native DEX AREAL. Такой дизайн гарантирует, что все сделки прозрачны, on-chain и ограничены собственной ликвидностной инфраструктурой протокола.Capital Accumulator
Capital Accumulator — это буфер между пользовательскими депозитами и OT-позициями. Капитал никогда не переходит напрямую из минта в Ownership Tokens — он всегда проходит через накопитель. Входящие потоки — капитал поступает в накопитель из:mint_rwt— депозит пользователя (чистая сумма после комиссии DAO)mint_rwt— комиссия vault 0.5% с каждого минтаvault_sell_ot— выручка от продажи Ownership Tokensdistribute_yield— 70% доходности OT, зачисленные как рост book value
vault_buy_ot— покупку Ownership Tokens на native DEX
Баланс Capital Accumulator всегда включается в
total_invested_capital для расчёта NAV Book Value. Независимо от того, находится капитал как USDC в накопителе или уже размещён в OT-позициях — он обеспечивает RWT. Неразмещённый капитал просто ещё не конвертирован в OT-позиции, но он учитывается в NAV.Стратегии исполнения
Капитал в накопителе развёртывается в OT-позиции согласно стратегии исполнения, определённой strategy authority. Контракт не исполняет одну крупную покупку — вместо этого поддерживает паттерны постепенного размещения для минимизации влияния на рынок и оптимизации цен входа.DCA (усреднение стоимости)
Разбивает общий капитал на равные порции и исполняет покупки в течение определённого периода (напр., разместить 1,667/день). Снижает риск тайминга и сглаживает цену входа.
Целевая аллокация
Определяет целевые веса портфеля по OT (напр., 30% OT-A, 25% OT-B, 20% OT-C). Strategy authority исполняет сделки для достижения этих целей по мере поступления капитала в накопитель.
Оппортунистическая
Strategy authority (особенно AI-агент) размещает капитал при благоприятных рыночных условиях — покупая на просадках, реагируя на изменения доходности или используя ликвидные события.
Стратегии исполнения не захардкожены в контракте. Контракт предоставляет примитивы (
vault_buy_ot, vault_sell_ot) и ограничения (StrategyConfig). Логика стратегии живёт в strategy authority — будь то предложение DAO, workflow мультисига или движок принятия решений AI-агента.Strategy Authority
Портфельные операции (vault_buy_ot, vault_sell_ot) доступны только выделенному strategy_authority — роли, хранящейся в PDA StrategyConfig. Эта роль отделена от governance multisig и может быть переназначена через set_strategy_authority.
Фаза 1: Управление через governance
Изначально
strategy_authority принадлежит DAO. Решения о покупке/продаже предлагаются и голосуются через футархию перед исполнением.Фаза 2: AI-агент
Governance передаёт
strategy_authority автономному AI-агенту. Агент исполняет портфельные стратегии в рамках on-chain ограничений — без off-chain доверия.Аккаунт StrategyConfig
PDAStrategyConfig хранит параметры, ограничивающие портфельные операции, независимо от того, кто является strategy_authority:
| Параметр | Описание |
|---|---|
strategy_authority | Текущий адрес, авторизованный для исполнения buy/sell |
allowed_ot_mints | Вайтлист OT-минтов, одобренных governance |
max_single_trade_bps | Макс. размер сделки в базисных пунктах от общего капитала vault (напр., 500 = 5%) |
max_daily_volume_bps | Макс. дневной объём торгов в bps от капитала vault |
min_diversification | Минимальное количество различных OT, которые vault обязан держать |
max_concentration_bps | Макс. аллокация в один OT в bps от общего портфеля |
Эти ограничения исполняются on-chain логикой программы. Даже AI-агент с полным
strategy_authority не может превысить эти лимиты — транзакция просто провалится. Governance может обновить параметры через update_strategy_config.Поток исполнения сделки
Решение стратегии
Strategy authority (governance или AI-агент) принимает решение о покупке или продаже конкретного OT на основе доходности, целей диверсификации или рыночных условий.
Валидация ограничений
Контракт проверяет сделку по лимитам
StrategyConfig: есть ли OT в вайтлисте? Не превышает ли размер сделки max_single_trade_bps? Не нарушит ли это max_concentration_bps или min_diversification?Поток капитала
При покупке: капитал берётся из Capital Accumulator → swap на native DEX → OT зачисляется в позиции vault. При продаже: OT продаётся на native DEX → выручка возвращается в Capital Accumulator.
Все сделки исполняются исключительно на AREAL native DEX. Контракт не имеет CPI-вызовов к внешним DEX-программам — это устраняет риск внешних зависимостей и гарантирует, что все потоки ликвидности укрепляют собственные рынки протокола.
Поток доходности
RWT Vault получает доходность от Ownership Tokens через контракт Yield Distribution. У vault есть собственный ClaimAccount — как у любого держателя OT — и он получает посекундные RWT-награды от каждого OT, которым владеет.Начисление доходности OT
RWT Vault держит OT разных проектов. Каждый проект распределяет доходность через контракт Yield Distribution, зачисляя RWT-награды в ClaimAccount vault каждую секунду — точно как обычному держателю.
Сбор доходности
Инструкция
accumulate_yield забирает накопленные RWT из ClaimAccount vault и переводит в YieldAccumulator. В Ephemeral Rollup это происходит каждую секунду — данные о доходности всегда актуальны.Разделение при распределении
Инструкция
distribute_yield считывает DistributionConfig и разделяет накопленную доходность:- 70% → зачисляется в
rwt_vault.total_invested_capital(рост NAV Book Value) - 15% → переводится на аккаунт пула ликвидности
- 5% → переводится в AREAL Treasury
- 10% → переводится в Reserve Pool
Последовательность
accumulate_yield → distribute_yield → update_nav выполняется как атомарный посекундный цикл внутри MagicBlock Ephemeral Rollup. NAV Book Value всегда актуален — нет задержки между начислением доходности и обновлением цены.Расчёт NAV Book Value
On-chain NAV Book Value — детерминированный расчёт, хранящийся в аккаунтеRwtVault, обновляемый каждую секунду циклом доходности в Ephemeral Rollup:
NAV Book Value = total_invested_capital / total_rwt_supplyГде
total_invested_capital — сумма всего капитала, обеспечивающего RWT, из трёх источников:
| Источник | Что это | Как поступает |
|---|---|---|
| Capital Accumulator (USDC) | Депозиты пользователей от mint_rwt + комиссия vault 0.5% | Каждый минт добавляет в баланс CA |
| Портфель OT (оценён в USD) | Ownership Tokens, купленные strategy authority | vault_buy_ot перемещает капитал из CA → OT-позиции |
| Yield credits (70%) | 70% доходности от распределений OT, зачисленные в book value | Посекундно через accumulate_yield → distribute_yield |
total_rwt_supply = текущее обращающееся предложение RWT mint.
Баланс Capital Accumulator (неразмещённый USDC) всегда учитывается в
total_invested_capital. Находится ли капитал в накопителе или уже размещён в OT-позициях — всё обеспечивает RWT и отражается в NAV.- Каждую секунду: доходность OT проходит через
accumulate_yield→distribute_yield→ 70% зачисляется вtotal_invested_capital→update_nav - При каждом минте: депозит + комиссия vault добавляются в Capital Accumulator →
total_invested_capitalобновляется атомарно
Вся арифметика использует операции fixed-point u128 с 12 знаками точности для предотвращения дрейфа плавающей точки. NAV хранится как значение
u64 в USDC-эквивалентных лампортах (6 десятичных знаков).Расчёт цены минтинга (атомарно, один блок)
Цена минтинга всегда выражена в USD. Весь расчёт и исполнение происходят атомарно в одном блоке Solana — пользователь не может быть фронтранут или получить устаревшую цену:Для USDC и других стейблкоинов с привязкой к USD цена оракла фактически равна $1.00, конвертация 1:1. Для волатильных токенов (напр., SOL, wBTC) оракл предоставляет цену в USD в реальном времени из Ephemeral Rollup MagicBlock, обеспечивая точное ценообразование в момент минта.
Обновление NAV в конце минта — часть той же транзакции. Следующий пользователь, который минтит, увидит обновлённый NAV, включающий депозит предыдущего — ноль разводнения, ноль устаревших цен.
Интеграция с MagicBlock
Контракт RWT использует для двух критических функций: посекундного накопления доходности и ценовых фидов оракулов в реальном времени.Накопление доходности
Аккаунт
YieldAccumulator делегируется в Ephemeral Rollup. Это позволяет crank-сервису вызывать accumulate_yield каждую секунду с субмиллисекундной финальностью внутри rollup.Ценовые фиды оракулов
MagicBlock предоставляет ценовые фиды в USD в реальном времени для всех принятых deposit-токенов. Инструкция
mint_rwt считывает эти аккаунты оракулов для конвертации любого одобренного токена в USD-эквивалент в момент минта.Коммиты на L1
Периодически (настраиваемый интервал, по умолчанию каждые 60 секунд) накопленное состояние коммитится обратно на Solana L1. Это обеспечивает актуальный баланс доходности на L1 для распределения.
Жизненный цикл
Делегирование
PDA
YieldAccumulator делегируется в MagicBlock через delegation program. Аккаунт становится доступным для записи в Ephemeral Rollup, оставаясь доступным для чтения на L1.Накопление в ER
Crank-сервис вызывает
accumulate_yield каждую секунду внутри Ephemeral Rollup. Каждый вызов считывает источники доходности OT и увеличивает баланс аккумулятора.Коммит на L1
Периодически rollup коммитит состояние
YieldAccumulator обратно на Solana L1. После коммита distribute_yield можно вызывать на L1 для разделения и перевода средств.Делегирование только
YieldAccumulator (а не всего vault) минимизирует поверхность доверия. Основное состояние vault — балансы, NAV, mint authority — остаётся на Solana L1 в любой момент времени.Безопасность
Модель полномочий
EngineAuthority — корень доверия: контролирует все governance-инструкции и может быть передан любому адресу через transfer_engine_authority. Портфельные операции требуют strategy_authority. Все остальные инструкции — permissionless.Владение PDA
Все аккаунты vault — это PDA, принадлежащие программе. Ни один внешний кошелёк не может напрямую изменить состояние vault. Mint authority принадлежит исключительно PDA
RwtMint.Защита от переполнения
Вся арифметика использует checked math (
checked_add, checked_mul, checked_div). Операции fixed-point u128 предотвращают потерю точности. Транзакции откатываются при переполнении.Защита от реентранси
Runtime-модель Solana предотвращает реентранси by design. Блокировки аккаунтов гарантируют отсутствие конкурентной модификации состояния vault в рамках одного слота.
Ограничения стратегии
Портфельные операции ограничены on-chain лимитами: вайтлист OT, макс. размер сделки, лимиты концентрации, минимумы диверсификации. Даже автономный агент не может превысить эти параметры.
Исполнение только на DEX
Все операции buy/sell маршрутизируются исключительно через AREAL native DEX посредством CPI. Нет интеграций с внешними DEX — устраняется поверхность атаки через сторонние зависимости.