From 08c070bd55dcf066aa02b72c482da5fcb741c3be Mon Sep 17 00:00:00 2001
From: AidarKC
Date: Sat, 16 May 2026 17:15:23 +0300
Subject: [PATCH] Add ticket transfer UI and deploy config checklist
---
shine/doc/SHINE_PAYMENTS_V2.md | 8 +-
shine/programs/DEPLOY_CONFIG_CHECKLIST.md | 81 ++++
shine/programs/shine_payments/src/lib.rs | 77 ++++
.../shine_payments/web/track_ticket.html | 71 +++
.../programs/shine_payments_legacy/Cargo.toml | 33 --
.../shine_payments_legacy/LEGACY_NOTICE.md | 6 -
.../dApp/copyToServer.sh | 30 --
.../shine_payments_legacy/dApp/init.html | 404 ------------------
.../shine_payments_legacy/src/investments.rs | 326 --------------
.../programs/shine_payments_legacy/src/lib.rs | 158 -------
.../programs/shine_payments_legacy/src/nft.rs | 190 --------
11 files changed, 236 insertions(+), 1148 deletions(-)
create mode 100644 shine/programs/DEPLOY_CONFIG_CHECKLIST.md
delete mode 100644 shine/programs/shine_payments_legacy/Cargo.toml
delete mode 100644 shine/programs/shine_payments_legacy/LEGACY_NOTICE.md
delete mode 100755 shine/programs/shine_payments_legacy/dApp/copyToServer.sh
delete mode 100644 shine/programs/shine_payments_legacy/dApp/init.html
delete mode 100644 shine/programs/shine_payments_legacy/src/investments.rs
delete mode 100644 shine/programs/shine_payments_legacy/src/lib.rs
delete mode 100644 shine/programs/shine_payments_legacy/src/nft.rs
diff --git a/shine/doc/SHINE_PAYMENTS_V2.md b/shine/doc/SHINE_PAYMENTS_V2.md
index d9e15e5..5c3b646 100644
--- a/shine/doc/SHINE_PAYMENTS_V2.md
+++ b/shine/doc/SHINE_PAYMENTS_V2.md
@@ -92,7 +92,13 @@
- если обе очереди пусты/выплачены:
- переводит весь доступный остаток inflow-вольта в DAO (без reward).
-9. Экономика покупки
+9. `change_ticket_recipient`
+ - текущий `recipient_wallet` тикета может сменить получателя на другой кошелек;
+ - тикет должен быть невыплаченным;
+ - смена запрещена, если этот тикет является следующим к выплате в текущем шаге
+ (с учетом приоритета очереди 1 над очередью 2).
+
+10. Экономика покупки
- сумма покупки идет в DAO;
- тикет получает выплату `purchase_usd_cents * coef_ppm / 1_000_000`;
- проверка лимита выполняется по `q1_sum_total_usd_cents` (исторически накопленная сумма, без вычета уже выплаченного).
diff --git a/shine/programs/DEPLOY_CONFIG_CHECKLIST.md b/shine/programs/DEPLOY_CONFIG_CHECKLIST.md
new file mode 100644
index 0000000..867c104
--- /dev/null
+++ b/shine/programs/DEPLOY_CONFIG_CHECKLIST.md
@@ -0,0 +1,81 @@
+# DEPLOY CONFIG CHECKLIST (Shine Programs)
+
+Документ для подготовки к реальному деплою (mainnet/prod): какие адреса и где заменить.
+
+## 1) Program IDs
+
+1. `shine/programs/shine_payments/src/lib.rs`
+ - `declare_id!("...")` для `shine_payments`.
+2. `shine/programs/shine_users/src/lib.rs`
+ - `declare_id!("...")` для `shine_users`.
+3. `shine/Anchor.toml`
+ - обновить `programs.devnet` / `programs.localnet` (и при необходимости добавить/обновить секцию под mainnet workflow).
+
+## 2) Shine Payments on-chain settings
+
+Файл: `shine/programs/shine_payments/src/settings.rs`
+
+Обязательные адреса:
+1. `DAO_WALLET`
+2. `MANAGER_WALLET`
+3. `PYTH_SOL_USD_ACCOUNT`
+4. `PYTH_SOL_USD_FEED_ID` (идентификатор feed для SOL/USD)
+
+Параметры экономики (по необходимости):
+1. `START_COEF_PPM`
+2. `START_LIMIT_USD_CENTS`
+3. `START_CALL_REWARD_LAMPORTS`
+4. `MAX_CALL_REWARD_LAMPORTS`
+5. `ORACLE_MAX_AGE_SECS`
+
+## 3) Shine Users on-chain settings
+
+Файл: `shine/programs/shine_users/src/settings.rs`
+
+Обязательные параметры:
+1. `REGISTRATION_FEE_RECEIVER` (куда идет комиссия регистрации)
+2. `REGISTRATION_FEE_LAMPORTS`
+3. при необходимости скорректировать лимитные/бонусные константы:
+ - `LIMIT_STEP`
+ - `LAMPORTS_PER_LIMIT_STEP`
+ - `START_BONUS_LIMIT`
+
+## 4) Web UI constants (hardcoded values)
+
+Проверить и заменить Program ID / Oracle account в HTML:
+1. `shine/programs/shine_payments/web/buy_ticket.html`
+2. `shine/programs/shine_payments/web/track_ticket.html`
+3. `shine/programs/shine_payments/web/admin_tools.html`
+4. `shine/programs/shine_payments/web/dao_tools.html`
+5. `shine/programs/shine_payments/web/manager_tools.html`
+
+Проверить RPC endpoint для нужной сети в соответствующих страницах.
+
+## 5) Скрипты и окружение
+
+Проверить конфиги и env-файлы, где участвуют адреса:
+1. `shine/scripts/**/config.env`
+2. `shine/scripts/**/dao.config.env`
+3. `shine/scripts/**/governance_token.config.env`
+
+## 6) Проверка перед деплоем
+
+1. `cargo check -p shine_payments`
+2. `cargo check -p shine_users`
+3. сверить, что `declare_id` совпадает с ключами деплоя программ.
+4. убедиться, что `PYTH_SOL_USD_ACCOUNT` читается в выбранной сети.
+5. прогнать smoke-тесты UI (buy / track / admin / dao / manager).
+
+## 7) Проверка после деплоя
+
+1. Выполнить `init` для `shine_payments`.
+2. Проверить существование PDA:
+ - `config_pda`
+ - `coef_limit_pda`
+ - `queues_pda`
+ - `inflow_vault_pda`
+3. Проверить покупку тикета и шаг выплаты на малой сумме.
+4. Проверить `change_ticket_recipient`:
+ - разрешено для не-next тикета;
+ - запрещено для next тикета.
+
diff --git a/shine/programs/shine_payments/src/lib.rs b/shine/programs/shine_payments/src/lib.rs
index 18f12f1..874b6cb 100644
--- a/shine/programs/shine_payments/src/lib.rs
+++ b/shine/programs/shine_payments/src/lib.rs
@@ -500,6 +500,61 @@ pub mod shine_payments {
Ok(())
}
+
+ pub fn change_ticket_recipient(
+ ctx: Context${t.recipient.toBase58()}${sig}`;
+ await refreshAll();
+ await findTickets();
+ } catch (e) {
+ resultEl.className = "err";
+ resultEl.textContent = String(e.message || e);
+ }
+ }
+
async function findTickets() {
const out = document.getElementById("ticketResult");
out.textContent = "";
@@ -430,6 +493,14 @@
document.getElementById("refreshBtn").addEventListener("click", refreshAll);
document.getElementById("findBtn").addEventListener("click", findTickets);
document.getElementById("stepBtn").addEventListener("click", stepPayout);
+ document.getElementById("ticketResult").addEventListener("click", (e) => {
+ const btn = e.target.closest(".transferBtn");
+ if (!btn) return;
+ const queueId = Number(btn.dataset.queue);
+ const index = btn.dataset.index;
+ const pda = btn.dataset.pda;
+ changeTicketRecipient(queueId, index, pda);
+ });
refreshAll();
diff --git a/shine/programs/shine_payments_legacy/Cargo.toml b/shine/programs/shine_payments_legacy/Cargo.toml deleted file mode 100644 index add95e4..0000000 --- a/shine/programs/shine_payments_legacy/Cargo.toml +++ /dev/null @@ -1,33 +0,0 @@ -[package] -name = "shine_payments" -version = "0.1.0" -description = "Payments and investments smart contract" -edition = "2021" - -[lib] -crate-type = ["cdylib", "lib"] -name = "shine_payments" -test = false -doctest = false -bench = false - -[dependencies] -anchor-lang = "0.31.1" -common = { path = "../common" } - -# ==== добавлено для NFT-функционала ==== -anchor-spl = { version = "0.31.1", features = ["associated_token", "token"] } -mpl-token-metadata = "5.1.1" -spl-token = { version = "4.0.0", features = ["no-entrypoint"] } -# ====================================== - -[features] -default = [] -no-entrypoint = [] -no-idl = [] -no-log-ix-name = [] -anchor-debug = [] -custom-heap = [] -custom-panic = [] -cpi = [] -idl-build = ["anchor-lang/idl-build"] diff --git a/shine/programs/shine_payments_legacy/LEGACY_NOTICE.md b/shine/programs/shine_payments_legacy/LEGACY_NOTICE.md deleted file mode 100644 index e9b68fb..0000000 --- a/shine/programs/shine_payments_legacy/LEGACY_NOTICE.md +++ /dev/null @@ -1,6 +0,0 @@ -# Важно - -Эта папка содержит устаревшую версию `shine_payments`. - -- Не использовать для новых доработок. -- Актуальная реализация находится в `programs/shine_payments`. diff --git a/shine/programs/shine_payments_legacy/dApp/copyToServer.sh b/shine/programs/shine_payments_legacy/dApp/copyToServer.sh deleted file mode 100755 index 55f4dfd..0000000 --- a/shine/programs/shine_payments_legacy/dApp/copyToServer.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -# Скрипт для копирования dApp на тестовый сервер - -# Настройки -LOCAL_FILE="init.html" -REMOTE_USER="aidar" -REMOTE_HOST="shineup.me" -REMOTE_PATH="/home/aidar/Docker_server/site/dApp" - -# Проверка, что файл существует -if [ ! -f "$LOCAL_FILE" ]; then - echo "Ошибка: файл $LOCAL_FILE не найден." - exit 1 -fi - -# Копирование файла -scp "$LOCAL_FILE" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}" - -# Проверка результата -if [ $? -eq 0 ]; then - echo "Файл успешно загружен на сервер." -else - echo "Ошибка при загрузке файла на сервер." - exit 1 -fi - -#echo -#echo "Нажмите Enter, чтобы закрыть..." -#read diff --git a/shine/programs/shine_payments_legacy/dApp/init.html b/shine/programs/shine_payments_legacy/dApp/init.html deleted file mode 100644 index 3e2b8ac..0000000 --- a/shine/programs/shine_payments_legacy/dApp/init.html +++ /dev/null @@ -1,404 +0,0 @@ - - -
- - -
- - - -
-