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

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

Контракт 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

Создаёт все основные PDA: EngineAuthority, RwtVault, RwtMint, CapitalAccumulator, YieldAccumulator, DistributionConfig, StrategyConfig и AcceptedMints. Устанавливает начальный engine authority, коэффициенты распределения и регистрирует начальные принимаемые deposit-минты с их ценовыми фидами оракулов.Authority: Governance multisig (однократный вызов)
Accounts:
  - authority:           Signer (governance)
  - rwt_vault:           PDA (init)
  - rwt_mint:            PDA (init)
  - yield_accumulator:   PDA (init)
  - distribution_config: PDA (init)
  - system_program
  - token_program
Минтит RWT в обмен на любой токен, одобренный DAO. Вся операция атомарна в рамках одного блока Solana:
  1. Снапшот NAV — считывает текущий rwt_vault.nav_book_value (обновляется посекундно циклом доходности в ER)
  2. Конвертация депозита в USD — считывает ценовой фид оракла для не-USD токенов
  3. Расчёт количества RWTrwt_out = net_deposit_usd / nav_book_value
  4. Применение комиссии — 1% (0.5% в Capital Accumulator, 0.5% в DAO)
  5. Перевод депозита в Capital Accumulator
  6. Минт RWT на кошелёк пользователя
  7. Обновление NAV — атомарно отражает новый депозит в total_invested_capital
Все 7 шагов выполняются в одной транзакции, одном блоке. Пользователь отправляет токены и получает RWT по точной цене NAV — без проскальзывания от изменений NAV между шагами.Контракт проверяет флаг mint_paused в MintGuardians — если любой хранитель активировал экстренную паузу, весь минтинг глобально остановлен до снятия паузы.Authority: Permissionless — вызвать может кто угодно (если минт не на глобальной паузе)
Accounts:
  - user:                Signer
  - user_deposit_ata:    Токен-аккаунт пользователя (любой одобренный mint)
  - user_rwt_ata:        Токен-аккаунт RWT пользователя
  - rwt_vault:           PDA (mut)
  - rwt_mint:            PDA (mut)
  - capital_accumulator: PDA (mut)
  - dao_fee_ata:         Аккаунт комиссии DAO
  - oracle_price_feed:   Аккаунт оракла MagicBlock для deposit token / USD
  - accepted_mints:      PDA (реестр одобренных минтов)
  - mint_guardians:      PDA (проверка глобальной паузы)
  - token_program

Args:
  - amount: u64          Сумма депозита в децималях deposit-токена
  - deposit_mint: Pubkey Mint депозитного токена
Экстренная пауза — останавливает весь минтинг RWT глобально. Любой один хранитель из списка MintGuardians может активировать это немедленно, без голосования DAO. Предназначено для быстрого реагирования на эксплойты, сбои оракулов или рыночные чрезвычайные ситуации.Authority: Любой хранитель из MintGuardians
Accounts:
  - guardian:            Signer (должен быть в списке MintGuardians)
  - mint_guardians:      PDA (mut, устанавливает mint_paused = true)
Возобновляет минтинг RWT после экстренной паузы. Минтинг продолжается по текущему NAV Book Value — цена не замораживается на время паузы, она отражает актуальное состояние vault в момент возобновления. Снять паузу может только Engine Authority (DAO) — это гарантирует, что один хранитель не может односторонне возобновить минтинг без консенсуса сообщества.Authority: Engine Authority (DAO governance)
Accounts:
  - engine_authority:    Signer (текущий engine authority)
  - mint_guardians:      PDA (mut, устанавливает mint_paused = false)
Добавляет или удаляет кошельки хранителей из списка MintGuardians. DAO голосует (через футархию) за назначение доверенных лиц или организаций, которые могут активировать экстренную паузу минтинга.Authority: Engine Authority (DAO governance)
Accounts:
  - engine_authority:    Signer (текущий engine authority)
  - mint_guardians:      PDA (mut)

Args:
  - wallet: Pubkey       Адрес кошелька хранителя
  - action: enum         { Add, Remove }
Добавляет или удаляет токены из списка принимаемых deposit-минтов для mint_rwt. Каждый одобренный токен должен иметь соответствующий ценовой фид оракла MagicBlock. Сообщество DAO голосует (через футархию) за одобрение новых токенов или отзыв существующих.Authority: DAO governance (голосование через футархию)
Accounts:
  - governance:          Signer (DAO governance)
  - accepted_mints:      PDA (mut)

Args:
  - mint: Pubkey         Mint токена для добавления/удаления
  - oracle_feed: Pubkey  Ценовой фид оракла MagicBlock для этого токена
  - action: enum         { Add, Remove }
Забирает накопленные RWT-награды из ClaimAccount vault (в контракте Yield Distribution) и переводит в YieldAccumulator. У RWT Vault есть собственный ClaimAccount — как у любого держателя OT — и он получает посекундную доходность от каждого OT в портфеле.Выполняется каждую секунду внутри Ephemeral Rollup как часть атомарного цикла доходности.Authority: Permissionless (crank)
Accounts:
  - crank:               Signer
  - rwt_vault:           PDA
  - yield_accumulator:   PDA (mut)
  - vault_claim_account: ClaimAccount vault в Yield Distribution (mut)
  - yield_distribution:  Программа Yield Distribution (CPI)
  - token_program
Считывает накопленную доходность из YieldAccumulator и разделяет её согласно коэффициентам DistributionConfig: 70% зачисляется в book value vault, 15% — в ликвидность, 5% — в treasury, 10% — в резерв.Authority: Permissionless (crank)
Accounts:
  - crank:               Signer
  - yield_accumulator:   PDA (mut)
  - distribution_config: PDA
  - rwt_vault:           PDA (mut)
  - treasury_ata:        Аккаунт Treasury
  - reserve_ata:         Аккаунт Reserve
  - liquidity_ata:       Аккаунт Liquidity pool
  - token_program
Обновляет коэффициенты распределения доходности и/или целевые аккаунты в DistributionConfig. Сообщество DAO может проголосовать (через футархию) за изменение пропорций распределения — корректируя проценты, добавляя новые направления или перенаправляя потоки в любой момент. Сумма всех коэффициентов должна составлять 100%.Authority: DAO governance (голосование через футархию)
Accounts:
  - governance:          Signer (DAO governance)
  - distribution_config: PDA (mut)

Args:
  - book_value_bps: u16      Аллокация в book value (базисные пункты)
  - liquidity_bps: u16       Аллокация в пул ликвидности (базисные пункты)
  - treasury_bps: u16        Аллокация в treasury (базисные пункты)
  - reserve_bps: u16         Аллокация в reserve pool (базисные пункты)
Пересчитывает NAV Book Value на основе текущего total invested capital (включая накопленные book value credits) и общего предложения RWT. Обновляет поле rwt_vault.nav_book_value.Authority: Permissionless (crank)
Accounts:
  - crank:               Signer
  - rwt_vault:           PDA (mut)
Берёт капитал из Capital Accumulator и выполняет покупку конкретного Ownership Token на AREAL native DEX. Vault маршрутизирует swap через DEX. Вызывается только текущим strategy_authority.Authority: strategy_authority (governance или AI-агент)
Accounts:
  - strategy_authority:  Signer (текущий оператор стратегии)
  - rwt_vault:           PDA (mut)
  - capital_accumulator: PDA (mut, источник капитала)
  - strategy_config:     PDA
  - vault_ot_ata:        Целевой OT-аккаунт vault (mut)
  - dex_pool:            Пул RWT/OT на native DEX
  - dex_program
  - token_program

Args:
  - ot_mint: Pubkey      Mint целевого Ownership Token
  - amount: u64          Капитал для размещения (в децималях deposit-токена)
  - min_ot_out: u64      Минимум OT к получению (защита от проскальзывания)
Продаёт конкретный Ownership Token на AREAL native DEX и возвращает выручку в Capital Accumulator. Капитал остаётся в накопителе до повторного размещения strategy authority. Вызывается только текущим strategy_authority.Authority: strategy_authority (governance или AI-агент)
Accounts:
  - strategy_authority:  Signer (текущий оператор стратегии)
  - rwt_vault:           PDA (mut)
  - capital_accumulator: PDA (mut, получает выручку)
  - strategy_config:     PDA
  - vault_ot_ata:        Исходный OT-аккаунт vault (mut)
  - dex_pool:            Пул RWT/OT на native DEX
  - dex_program
  - token_program

Args:
  - ot_mint: Pubkey      Mint целевого Ownership Token
  - ot_amount: u64       Количество OT для продажи
  - min_capital_out: u64 Минимум капитала к получению (защита от проскальзывания)
Передаёт роль strategy_authority любому адресу в любой момент времени. Сообщество DAO может проголосовать (через футархию) за назначение нового оператора портфеля — будь то AI-агент, другой multisig, индивидуальный кошелёк или возврат управления самому DAO. Нет ограничений на то, кто может стать новым authority или когда может произойти передача.Authority: DAO governance (голосование через футархию)
Accounts:
  - governance:          Signer (governance multisig)
  - strategy_config:     PDA (mut)

Args:
  - new_authority: Pubkey   Адрес нового оператора стратегии
Передаёт верхнеуровневый Engine Authority всего контракта RWT новому адресу. Новый authority получает полный контроль над всеми governance-инструкциями: update_distribution_config, update_accepted_mints, set_strategy_authority, update_strategy_config и сам transfer_engine_authority.Это позволяет передать RWT Engine другому DAO, другому мультисигу, отдельному аккаунту или любой on-chain структуре управления. Передача вступает в силу немедленно — без timelock или многоступенчатого подтверждения.Authority: Только текущий Engine Authority
Accounts:
  - current_authority:   Signer (текущий engine authority)
  - engine_authority:    PDA (mut)

Args:
  - new_authority: Pubkey   Адрес нового engine authority

Engine Authority

Контракт RWT Engine имеет единый верхнеуровневый authority, хранящийся в PDA EngineAuthority. Это корень доверия всего контракта — он контролирует все governance-операции. Engine authority может быть передан любому адресу в любой момент — что открывает следующие сценарии:

Передача DAO → DAO

Текущий DAO передаёт контроль над RWT Engine другому DAO с иной структурой governance, юрисдикцией или сообществом.

Миграция мультисига

Authority переходит от одного мультисига к другому — например, при ротации членов совета безопасности или обновлении реализации мультисига.

Прогрессивная децентрализация

Старт с мультисига основателей, переход к DAO сообщества, затем к полностью автономному on-chain governance контракту.

Экстренное управление

В случае сбоя governance сообщество может проголосовать за передачу authority доверенной организации или совету безопасности для временного кризисного управления.
transfer_engine_authority необратима с точки зрения старого authority — после передачи предыдущий authority не имеет специального доступа. Новый authority должен явно передать обратно, если требуется возврат. Это by design: RWT Engine — суверенный контракт, который полностью принадлежит тому, кто владеет 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 Tokens
  • distribute_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 (усреднение стоимости)

Разбивает общий капитал на равные порции и исполняет покупки в течение определённого периода (напр., разместить 100KвOTAза60дней100K в OT-A за 60 дней ≈ 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

PDA StrategyConfig хранит параметры, ограничивающие портфельные операции, независимо от того, кто является 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.

Поток исполнения сделки

1

Решение стратегии

Strategy authority (governance или AI-агент) принимает решение о покупке или продаже конкретного OT на основе доходности, целей диверсификации или рыночных условий.
2

Валидация ограничений

Контракт проверяет сделку по лимитам StrategyConfig: есть ли OT в вайтлисте? Не превышает ли размер сделки max_single_trade_bps? Не нарушит ли это max_concentration_bps или min_diversification?
3

Поток капитала

При покупке: капитал берётся из Capital Accumulator → swap на native DEX → OT зачисляется в позиции vault. При продаже: OT продаётся на native DEX → выручка возвращается в Capital Accumulator.
4

Обновление состояния vault

После сделки балансы портфеля rwt_vault и total_invested_capital обновляются атомарно. Последующий update_nav отражает новый состав портфеля в NAV Book Value.
Все сделки исполняются исключительно на 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

Обновление NAV (атомарно)

update_nav пересчитывает NAV Book Value на основе обновлённого total_invested_capital. В Ephemeral Rollup выполняется каждую секунду сразу после distribute_yield — NAV всегда отражает актуальную доходность.
Последовательность accumulate_yielddistribute_yieldupdate_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 authorityvault_buy_ot перемещает капитал из CA → OT-позиции
Yield credits (70%)70% доходности от распределений OT, зачисленные в book valueПосекундно через accumulate_yielddistribute_yield
И total_rwt_supply = текущее обращающееся предложение RWT mint.
Баланс Capital Accumulator (неразмещённый USDC) всегда учитывается в total_invested_capital. Находится ли капитал в накопителе или уже размещён в OT-позициях — всё обеспечивает RWT и отражается в NAV.
NAV растёт непрерывно потому что:
  • Каждую секунду: доходность OT проходит через accumulate_yielddistribute_yield → 70% зачисляется в total_invested_capitalupdate_nav
  • При каждом минте: депозит + комиссия vault добавляются в Capital Accumulator → total_invested_capital обновляется атомарно
Вся арифметика использует операции fixed-point u128 с 12 знаками точности для предотвращения дрейфа плавающей точки. NAV хранится как значение u64 в USDC-эквивалентных лампортах (6 десятичных знаков).

Расчёт цены минтинга (атомарно, один блок)

Цена минтинга всегда выражена в USD. Весь расчёт и исполнение происходят атомарно в одном блоке Solana — пользователь не может быть фронтранут или получить устаревшую цену:
// Шаг 1: Снапшот текущего NAV (обновляется каждую секунду циклом ER)
nav_book_value = rwt_vault.nav_book_value

// Шаг 2: Конвертация депозита в USD (оракл для не-USD токенов)
token_usd_price = oracle_price_feed.price    // напр., SOL = $145.32
deposit_usd_value = deposit_amount * token_usd_price

// Шаг 3: Применение комиссии
fee_usd = deposit_usd_value * 0.01
vault_fee = fee_usd / 2    → переводится в Capital Accumulator
dao_fee = fee_usd / 2      → переводится в DAO

// Шаг 4: Расчёт количества RWT по точному NAV
net_usd = deposit_usd_value - fee_usd
rwt_amount = net_usd / nav_book_value

// Шаг 5: Минт + обновление NAV атомарно
mint(rwt_amount) → пользователь
capital_accumulator += net_usd + vault_fee
total_invested_capital += net_usd + vault_fee  // баланс CA входит в total
total_rwt_supply += rwt_amount
nav_book_value = total_invested_capital / total_rwt_supply
Для 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 для распределения.

Жизненный цикл

1

Делегирование

PDA YieldAccumulator делегируется в MagicBlock через delegation program. Аккаунт становится доступным для записи в Ephemeral Rollup, оставаясь доступным для чтения на L1.
2

Накопление в ER

Crank-сервис вызывает accumulate_yield каждую секунду внутри Ephemeral Rollup. Каждый вызов считывает источники доходности OT и увеличивает баланс аккумулятора.
3

Коммит на L1

Периодически rollup коммитит состояние YieldAccumulator обратно на Solana L1. После коммита distribute_yield можно вызывать на L1 для разделения и перевода средств.
4

Автоматизация crank

Permissionless crank вызывает distribute_yield после каждого L1-коммита. Кто угодно может запускать crank — специальные полномочия не требуются.
Делегирование только 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 — устраняется поверхность атаки через сторонние зависимости.
Контракт RWT в настоящее время находится в разработке. Эта документация описывает целевую архитектуру. Код контракта ещё не прошёл аудит. Не полагайтесь на эти спецификации для продакшен-использования до завершения формального аудита.