5.5 KiB
SHINE Payments v2
Назначение
shine_payments v2 — контракт очереди выплат с двумя очередями:
- обычная покупка билета (очередь 1);
- менеджерское добавление билетов (очередь 1 и очередь 2 по лимитам от DAO);
- пошаговые выплаты из inflow-вольта с приоритетом очереди 1.
Сейчас тестовый этап в Devnet: расчеты и хранение в USD-центах (1 USD = 100), при этом реальные on-chain переводы выполняются в SOL по курсу Pyth SOL/USD.
PDA
-
config_pda(shine_payments_v3_config)dao_walletmanager_wallet(сервисный параметр, для будущих сценариев)inflow_vault
-
coef_limit_pda(shine_payments_v3_coef_limit)coef_ppm(fixed-point, scale = 1_000_000)limit_usd_cents(лимит суммарной исторической суммы очереди 1 для обычной покупки)call_reward_lamports(награда за шаг выплат, максимум 0.01 SOL)
-
queues_pda(shine_payments_v3_queues)- очередь 1:
tickets_total,tickets_paid,sum_total,sum_paid - очередь 2:
tickets_total,tickets_paid,sum_total,sum_paid
- очередь 1:
-
inflow_vault_pda(shine_payments_v3_inflow_vault)- входящий PDA-вольт программы для выплат.
-
ticket_pda- очередь 1:
shine_payments_v3_q1_ticket + index_le_u64 - очередь 2:
shine_payments_v3_q2_ticket + index_le_u64 - поля тикета:
queue_idindexis_paidrecipient_walletpayout_usd_centsdebt_before_usd_cents
- очередь 1:
-
manager_allowance_pda(shine_p_v3_manager_allow + manager_pubkey)manager_walletq1_available_usd_centsq2_available_usd_cents
Методы
-
init- вызывается один раз (кто угодно);
- создает
config_pda,coef_limit_pda,queues_pda,inflow_vault_pda.
-
update_coef_limit(толькоdao_walletиз config)- меняет коэффициент, лимит покупки в очередь 1 и награду шага выплат;
- ограничение награды: не более
0.01 SOL.
-
grant_manager_limits(толькоdao_walletиз config)- DAO выдает/добавляет лимиты менеджеру:
add_q1_usd_centsadd_q2_usd_cents
- если PDA менеджера нет — создается;
- если есть — лимиты увеличиваются.
- DAO выдает/добавляет лимиты менеджеру:
-
buy_ticket- обратная совместимость: покупка с входом в lamports, но запись тикета в USD-центах;
- использует Pyth SOL/USD и stale-check (не старше 120 секунд).
-
buy_ticket_usd- покупка билета в очередь 1 с суммой в USD-центах;
- сумма SOL к оплате считается в контракте по Pyth;
- есть
max_pay_lamportsдля slippage-защиты.
-
buy_ticket_sol- покупка билета в очередь 1 с суммой в lamports;
- USD-объём покупки считается в контракте по Pyth;
- есть
min_expected_usd_centsдля slippage-защиты.
-
manager_add_ticket- менеджер добавляет тикет в очередь 1 или 2;
- без денежного перевода;
- списывает лимит менеджера по выбранной очереди (в USD-центах).
-
step_payout- выбирает очередь по приоритету:
- сначала очередь 1;
- если в 1-й нет ожидания — очередь 2.
- перед выплатой получает текущий SOL/USD из Pyth и проверяет stale.
- шаг выплаты:
- очередь 1:
Xполучателю тикета +Xв DAO +rewardвызывающему; - очередь 2:
Xполучателю тикета +2Xв DAO +rewardвызывающему.
- очередь 1:
- если обе очереди пусты/выплачены:
- переводит весь доступный остаток inflow-вольта в DAO (без reward).
- выбирает очередь по приоритету:
-
Экономика покупки
- сумма покупки идет в DAO;
- тикет получает выплату
purchase_usd_cents * coef_ppm / 1_000_000; - проверка лимита выполняется по
q1_sum_total_usd_cents(исторически накопленная сумма, без вычета уже выплаченного).
Стартовые настройки
См. programs/shine_payments/src/settings.rs:
START_COEF_PPM = 5_000_000(коэффициент 5.0)START_LIMIT_USD_CENTS = 10_000 USDSTART_CALL_REWARD_LAMPORTS = 0.008 SOLORACLE_MAX_AGE_SECS = 120PYTH_SOL_USD_FEED_IDPYTH_SOL_USD_ACCOUNTDAO_WALLETMANAGER_WALLET
Тестовый режим
Пока нет финального production-потока пополнения inflow из регистрации/экосистемы, inflow-вольт пополняется вручную в Devnet, после чего выполняются шаги выплат.