# Архитектура Solana-программ SHiNE Документ описывает рабочую архитектуру Solana-части SHiNE: три Anchor-программы, DAO, ключи управления, PDA-счета и движение денег. Это архитектурная справка. Она не меняет код, формат PDA-записи пользователя, серверный API или формат блокчейна SHiNE. Статус: актуализировано по коду `shine-solana/shine/programs/*` на 2026-05-25. Связанные документы: - `Dev_Docs/Инициализация_Solana_регистрации/README.md` — single source of truth по деплою и первичной инициализации регистрации пользователей. - `shine-solana/shine/doc/formats/shine-user-pda-format-v.1.0.md` — точный формат `user_pda` для `shine_users`. - `shine-solana/shine/doc/FUNDS_FLOW.md` — короткая справка по денежным потокам внутри Solana-модуля. ## Кратко В Solana-модуле сейчас три основные программы: 1. `shine_login_guard` — проверяет логин и возвращает класс логина: обычный, premium или trademark. 2. `shine_users` — создает и обновляет пользовательскую PDA-запись, проверяет подписи и берет оплату за регистрацию/увеличение лимита. 3. `shine_payments` — принимает входящий поток средств в `inflow_vault`, ведет очереди тикетов, позволяет DAO выдавать лимиты менеджерам и выполняет выплаты. DAO в текущем виде не является отдельной Anchor-программой SHiNE внутри `programs/`. Это управляющая модель поверх кошельков, governance-скриптов и authority-адресов. Для проектирования ее удобно считать отдельным управляющим блоком: DAO голосует, назначает управляющие ключи, управляет казной и вызывает защищенные методы второй и третьей программ. ## Общая схема Редактируемая Mermaid-схема находится в [schemes/architecture.mmd](schemes/architecture.mmd). Картинки: - [schemes/architecture.svg](schemes/architecture.svg) - [schemes/architecture.png](schemes/architecture.png) ## Программы и функции | Блок | Папка/имя | Текущие функции из кода | Основной смысл | | --- | --- | --- | --- | | 1 | `shine_login_guard` | `classify_login` | Проверка логина перед регистрацией. | | 2 | `shine_users` | `init_users_economy_config`, `update_users_economy_config`, `create_user_pda`, `update_user_pda` | Регистрация пользователя, обновление записи, экономика лимита. | | 3 | `shine_payments` | `init`, `update_coef_limit`, `grant_manager_limits`, `buy_ticket`, `buy_ticket_usd`, `buy_ticket_sol`, `manager_add_ticket`, `step_payout`, `change_ticket_recipient` | Vault, билеты, очереди, выплаты, DAO-настройки, лимиты менеджеров. | | DAO | governance/authority | Вызовы через governance и управляющие ключи | Управление правами, казной, настройками и будущими обновлениями программ. | ## Актуальные program id Актуальные адреса заданы одновременно в `Anchor.toml`, `declare_id!` программ и `programs/common/src/deploy_config.rs`: | Программа | Program ID | | --- | --- | | `shine_login_guard` | `3xkopA7cXagxzMFrKdv3NCBfV6BKiRJCk69kr27M2sRo` | | `shine_users` | `FZS1YctoeEhCkZ5VTjsysUFAXR8CqxYztcLboXcg2Rpm` | | `shine_payments` | `c4yTa4JT9EtQDCBX9LmWFK6T2gp4JGsuymFbom2EudW` | Если эти адреса меняются, нужно синхронно обновить: 1. `shine-solana/shine/Anchor.toml` 2. `declare_id!` в `programs/*/src/lib.rs` 3. `programs/common/src/deploy_config.rs` 4. UI/серверные константы, перечисленные в `Dev_Docs/Инициализация_Solana_регистрации/README.md` ## Ключи и authority Для удобного понимания на старте можно считать, что есть четыре группы ключей: 1. `key_1` / authority программы `shine_login_guard`. - Сейчас программа только классифицирует логин. - На первом этапе ее можно оставить под отдельным ключом. - В будущем право обновления можно передать DAO. 2. `key_2` / authority программы `shine_users`. - Отвечает за деплой/upgrade второй программы. - Защищенное обновление economy-конфига в коде уже проверяет `DAO_AUTHORITY`. - В целевой модели upgrade-authority второй программы нужно передать DAO. 3. `key_3` / authority программы `shine_payments`. - Отвечает за деплой/upgrade третьей программы. - Защищенные методы `update_coef_limit` и `grant_manager_limits` проверяют `dao_wallet` из `ConfigState`. - В целевой модели upgrade-authority третьей программы нужно передать DAO. 4. DAO-ключи. - Это управляющие кошельки/токены/realm governance. - DAO может добавлять и отзывать управляющие ключи по голосованию. - DAO-казна получает деньги от покупки тикетов и DAO-часть выплат из `inflow_vault`. Адреса program id сейчас берутся из `programs/common/src/deploy_config.rs`. Для production/devnet можно подбирать vanity-адреса с понятным началом вроде `SHi...`, но это отдельная операция генерации ключей и деплоя. ## Счета и PDA Постоянные PDA и счета: 1. `shine_users` - `user_pda` — пользовательская запись по seed `login=`, создается для каждого логина. - `users_economy_config_pda` — общие параметры экономики регистрации и лимита. 2. `shine_payments` - `config_pda` — хранит `dao_wallet` и адрес `inflow_vault`. - `coef_limit_pda` — хранит коэффициент выплат, лимит очереди и награду вызывающему `step_payout`. - `queues_pda` — агрегаты очередей выплат. - `inflow_vault_pda` — PDA-вольт, куда `shine_users` переводит оплату регистрации и увеличения лимита. - `ticket_pda` — отдельная PDA-запись тикета на каждую покупку/менеджерскую выдачу. - `manager_allowance_pda` — PDA лимитов конкретного менеджера. 3. DAO - `dao_wallet` / treasury — казна DAO. - governance-аккаунты DAO — realm, governance, proposal/vote records и связанные аккаунты SPL Governance, если используется эта модель. ## Правило разделения с основным сервером Solana-модуль лежит в основном репозитории как отдельная папка `shine-solana/shine/`, но не подключается автоматически к сборке или деплою основного сервера SHiNE. Команды `deployServer` и `deployUI` не должны деплоить Anchor-программы. Solana build/deploy выполняется отдельно из папки `shine-solana/shine/` по локальным правилам модуля. ## Движение денег Основные потоки: 1. Регистрация пользователя через `shine_users::create_user_pda`. - Платит `signer`. - Деньги идут в `shine_payments::inflow_vault_pda`. - Сумма состоит из регистрационной комиссии и оплаты дополнительного лимита. 2. Увеличение лимита через `shine_users::update_user_pda`. - Платит `signer`. - Деньги идут в тот же `inflow_vault_pda`. - Сумма равна оплате дополнительного лимита. 3. Покупка тикета через `shine_payments::buy_ticket*`. - Платит покупатель. - Деньги сразу идут в `dao_wallet`. - Одновременно создается тикет на выплату. 4. Выплата через `shine_payments::step_payout`. - Вызвать может любой подписант. - Деньги берутся из `inflow_vault_pda`. - Часть идет получателю тикета. - Часть идет в `dao_wallet`. - Небольшая награда идет вызвавшему шаг выплат. - Если очереди пустые, весь доступный остаток `inflow_vault_pda` переводится в DAO. ## Передача прав DAO Минимальная целевая модель: 1. `shine_login_guard` - Пока оставить на отдельном ключе `key_1`. - Передачу DAO сделать позже, когда логика premium/trademark стабилизируется. 2. `shine_users` - Economy-настройки уже должны обновляться DAO-authority. - Upgrade-authority программы после проверки можно передать DAO. 3. `shine_payments` - DAO уже управляет настройками выплат и лимитами менеджеров через `dao_wallet`. - Upgrade-authority программы после проверки можно передать DAO. 4. DAO - Управляет казной. - Принимает решения голосованием. - Добавляет/отзывает управляющие ключи. - Вызывает защищенные методы второй и третьей программ. - В будущем может принять управление первой программой. ## Детальные файлы - [details/shine_login_guard.md](details/shine_login_guard.md) - [details/shine_users.md](details/shine_users.md) - [details/shine_payments.md](details/shine_payments.md) - [details/shine_dao.md](details/shine_dao.md) - [details/accounts_and_money_flow.md](details/accounts_and_money_flow.md)