7.0 KiB
shine_payments
Кратко
shine_payments — третья программа Solana-модуля SHiNE. Она отвечает за vault входящих средств, DAO-казну, покупку тикетов, менеджерские лимиты, очереди выплат и пошаговое исполнение выплат.
Папка программы: shine-solana/shine/programs/shine_payments/.
Текущие функции
-
init- Создает основные PDA:
config_pda,coef_limit_pda,queues_pda,inflow_vault_pda. - Записывает
dao_walletи стартовые параметры выплат.
- Создает основные PDA:
-
update_coef_limit- Обновляет коэффициент выплаты, лимит очереди и награду вызвавшему
step_payout. - Требует подпись DAO-кошелька из
ConfigState.
- Обновляет коэффициент выплаты, лимит очереди и награду вызвавшему
-
grant_manager_limits- DAO выдает менеджеру лимиты на создание тикетов в очередях Q1/Q2.
- Создает или обновляет
manager_allowance_pda.
-
buy_ticket- Покупка тикета с суммой в lamports, пересчетом через Pyth SOL/USD.
-
buy_ticket_usd- Покупка тикета от USD-центов с защитой по максимальному платежу в lamports.
-
buy_ticket_sol- Покупка тикета в lamports с проверкой минимального ожидаемого USD-эквивалента.
-
manager_add_ticket- Менеджер создает тикет за счет выданного ему DAO-лимита.
-
step_payout- Любой подписант может вызвать шаг выплат.
- Программа выплачивает следующий тикет, DAO-часть и награду вызывающему.
-
change_ticket_recipient- Текущий получатель тикета может поменять адрес получателя, если тикет еще не следующий на выплату.
Аргументы инструкций
init аргументов не принимает.
update_coef_limit:
coef_ppm: u64limit_usd_cents: u64call_reward_lamports: u64
grant_manager_limits:
manager_wallet: Pubkeyadd_q1_usd_cents: u64add_q2_usd_cents: u64
buy_ticket:
amount_lamports: u64recipient_wallet: Pubkey
buy_ticket_usd:
amount_usd_cents: u64max_pay_lamports: u64recipient_wallet: Pubkey
buy_ticket_sol:
amount_lamports: u64min_expected_usd_cents: u64recipient_wallet: Pubkey
manager_add_ticket:
queue_id: u8— только1или2recipient_wallet: Pubkeypayout_usd_cents: u64
change_ticket_recipient:
new_recipient_wallet: Pubkey
Главные PDA
-
config_pda- Seed:
shine_payments_config. - Хранит
dao_walletиinflow_vault. - Размер PDA:
8 + 160байт.
- Seed:
-
coef_limit_pda- Seed:
shine_payments_coef_limit. - Хранит коэффициент выплат, лимит и награду
step_payout. - Размер PDA:
8 + 96байт.
- Seed:
-
queues_pda- Seed:
shine_payments_queues. - Хранит агрегаты очередей Q1/Q2.
- Размер PDA:
8 + 192байт.
- Seed:
-
inflow_vault_pda- Seed:
shine_payments_inflow_vault. - Принимает деньги от
shine_users. - Из него выполняются выплаты тикетам, DAO и вызывающему
step_payout. - Размер PDA:
8 + 32байт.
- Seed:
-
ticket_pda- Seed зависит от очереди и индекса тикета.
- Отдельная PDA-запись на каждый тикет.
- Q1 seed:
shine_payments_q1_ticket+ticket_index. - Q2 seed:
shine_payments_q2_ticket+ticket_index. - Размер PDA:
8 + 160байт.
-
manager_allowance_pda- Seed:
shine_p_manager_allow+ адрес менеджера. - Хранит доступный лимит менеджера по Q1/Q2.
- Размер PDA:
8 + 128байт.
- Seed:
Текущие параметры
Параметры initial config из programs/shine_payments/src/settings.rs:
| Поле | Значение | Смысл |
|---|---|---|
START_COEF_PPM |
5_000_000 |
коэффициент 5.0x в ppm-масштабе |
START_LIMIT_USD_CENTS |
1_000_000 |
стартовый лимит Q1: 10_000 USD |
START_CALL_REWARD_LAMPORTS |
8_000_000 |
награда вызвавшему step_payout, 0.008 SOL |
MAX_CALL_REWARD_LAMPORTS |
10_000_000 |
максимум награды, 0.01 SOL |
ORACLE_MAX_AGE_SECS |
120 |
максимальный возраст цены Pyth |
Для расчетов используется Pyth SOL/USD:
- feed id:
0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d - price update account:
7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE
Деньги
Входы:
- из
shine_usersвinflow_vault_pdaпри регистрации и увеличении лимита; - от покупателя тикета сразу в
dao_walletприbuy_ticket*.
Выходы:
- из
inflow_vault_pdaполучателю тикета; - из
inflow_vault_pdaвdao_wallet; - из
inflow_vault_pdaвызвавшемуstep_payout; - если очереди пустые, весь доступный остаток
inflow_vault_pdaпереводится в DAO.
Очереди и выплаты
Выплаты идут строго пошагово:
- если есть невыплаченные Q1-тикеты,
step_payoutберет следующий Q1; - если Q1 пустая, берется следующий Q2;
- для Q1 DAO-часть равна сумме тикета в USD;
- для Q2 DAO-часть равна двойной сумме тикета в USD;
- перед выплатой суммы пересчитываются из USD-центов в lamports по Pyth SOL/USD;
- если в
inflow_vault_pdaне хватает средств на тикет, DAO-часть и награду вызвавшему, шаг отклоняется.
change_ticket_recipient запрещает менять получателя у тикета, который является следующим на выплату.
Ключи и управление
На старте удобно считать, что у программы есть отдельный управляющий ключ key_3.
Целевая модель:
update_coef_limitвызывает DAO;grant_manager_limitsвызывает DAO;- upgrade-authority программы после проверки передается DAO;
step_payoutостается открытым для любого подписанта, чтобы выплаты не зависели от одного оператора.