From 6bf5d1d5edfede6b485398133e02d93a30e803316af36ad5afc4be88ffb6f1c6 Mon Sep 17 00:00:00 2001 From: AidarKC Date: Sun, 7 Jun 2026 10:58:06 +0400 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D1=81=D0=BA?= =?UTF-8?q?=D1=83=D1=8E=20Solana-=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D1=8E=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=20=D1=83=D1=85=D0=BE=D0=B4=D0=B0=20=D0=BE=D1=82=20Anchor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...клиентская_solana_регистрация_no_anchor.md | 30 ++++++++++++++ VERSION.properties | 4 +- shine-UI/js/pages/solana-users-init-view.js | 3 +- .../js/services/solana-register-service.js | 6 +-- .../shine/doc/shine_payments_e2e_test_plan.md | 41 +++++++++++++++++++ 5 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 Dev_Docs/Pending_Features/2026-06-07_1345_клиентская_solana_регистрация_no_anchor.md create mode 100644 shine-solana/shine/doc/shine_payments_e2e_test_plan.md diff --git a/Dev_Docs/Pending_Features/2026-06-07_1345_клиентская_solana_регистрация_no_anchor.md b/Dev_Docs/Pending_Features/2026-06-07_1345_клиентская_solana_регистрация_no_anchor.md new file mode 100644 index 0000000..e7d6526 --- /dev/null +++ b/Dev_Docs/Pending_Features/2026-06-07_1345_клиентская_solana_регистрация_no_anchor.md @@ -0,0 +1,30 @@ +# Клиентская Solana-регистрация после ухода от Anchor + +## Краткое описание + +Исправлен рассинхрон обычного клиентского UI с no-Anchor ABI программ: + +- `shine_login_guard` +- `shine_users` + +Исправлены клиентские вызовы: + +1. Solana-предпроверка логина в обычном UI. +2. `init_users_economy_config` в обычном UI. + +## Что проверять + +1. На странице регистрации проверка свободного логина не выдаёт `InvalidInstructionData`. +2. Для свободного обычного логина отображается корректный статус без fallback-предупреждения про недоступную Solana-предпроверку. +3. Регистрация пользователя через обычный UI проходит до конца. +4. Страница `Solana: init регистрации` в обычном UI отправляет корректную транзакцию и не падает из-за старого Anchor discriminator. + +## Ожидаемый результат + +1. `shine_login_guard` принимает клиентский precheck. +2. `init_users_economy_config` из обычного UI совместим с текущей программой `shine_users`. +3. Обычный клиентский UI ведёт себя так же, как серверный UI, там где используется общий no-Anchor путь. + +## Статус + +- `pending` diff --git a/VERSION.properties b/VERSION.properties index 4713d7d..ebdb0ec 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.132 -server.version=1.2.124 +client.version=1.2.133 +server.version=1.2.125 diff --git a/shine-UI/js/pages/solana-users-init-view.js b/shine-UI/js/pages/solana-users-init-view.js index 062ad15..3c85e78 100644 --- a/shine-UI/js/pages/solana-users-init-view.js +++ b/shine-UI/js/pages/solana-users-init-view.js @@ -116,7 +116,6 @@ export function render({ navigate }) { const connection = new solana.Connection(String(state.entrySettings.solanaServer || ''), 'confirmed'); const programPubkey = new solana.PublicKey(programId); - const discriminator = Uint8Array.from([13, 16, 103, 175, 121, 137, 166, 222]); const ix = new solana.TransactionInstruction({ programId: programPubkey, keys: [ @@ -124,7 +123,7 @@ export function render({ navigate }) { { pubkey: economyPda, isSigner: false, isWritable: true }, { pubkey: solana.SystemProgram.programId, isSigner: false, isWritable: false }, ], - data: discriminator, + data: Uint8Array.from([1]), }); const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash('confirmed'); diff --git a/shine-UI/js/services/solana-register-service.js b/shine-UI/js/services/solana-register-service.js index b5d77ba..23d1416 100644 --- a/shine-UI/js/services/solana-register-service.js +++ b/shine-UI/js/services/solana-register-service.js @@ -4,7 +4,7 @@ import { SHINE_LOGIN_GUARD_PROGRAM_ID, } from '../solana-programs.js'; -const CLASSIFY_LOGIN_DISCRIMINATOR = new Uint8Array([112, 97, 152, 32, 255, 73, 108, 86]); +const CLASSIFY_LOGIN_INSTRUCTION_TAG = 1; const PRECHECK_SIM_PAYER = 'FUc28vNixp7F3nnkpGVt6nuJbgvJ4429v4B5wS52Df6P'; let solanaLibPromise = null; @@ -33,7 +33,7 @@ class BorshBuf { function serializeClassifyLoginArgs(login) { const b = new BorshBuf(); - b.raw(CLASSIFY_LOGIN_DISCRIMINATOR); + b.u8(CLASSIFY_LOGIN_INSTRUCTION_TAG); b.str(String(login || '')); return b.result(); } @@ -78,7 +78,7 @@ export async function precheckLoginClassOnSolana({ login, solanaEndpoint }) { const payer = new solana.PublicKey(PRECHECK_SIM_PAYER); const ix = new solana.TransactionInstruction({ programId: loginGuardProgram, - keys: [{ pubkey: payer, isSigner: true, isWritable: false }], + keys: [], data: serializeClassifyLoginArgs(String(login || '').toLowerCase()), }); const { blockhash } = await connection.getLatestBlockhash('confirmed'); diff --git a/shine-solana/shine/doc/shine_payments_e2e_test_plan.md b/shine-solana/shine/doc/shine_payments_e2e_test_plan.md new file mode 100644 index 0000000..36d9382 --- /dev/null +++ b/shine-solana/shine/doc/shine_payments_e2e_test_plan.md @@ -0,0 +1,41 @@ +# План тестирования `shine_payments` после переписи без Anchor и добавления `Q3` + +## Назначение документа + +Это не описание бизнес-логики программы и не формат PDA. + +Это отдельный план ручной и полуавтоматической проверки для сценария: + +- перепись `shine_payments` на чистый `solana_program`; +- отказ от `programs/common`; +- добавление очереди `Q3`; +- обновление тестового HTML UI. + +## Что проверять + +1. Деплой новой версии программы и единый актуальный `program id` в коде и UI. +2. Однократный `init` на пустых PDA. +3. Покупку билетов через `buy_ticket_usd` и `buy_ticket_sol`. +4. DAO-управление: + - `update_coef_limit` + - `grant_manager_limits` +5. Создание менеджерских тикетов во все три очереди: + - `Q1` + - `Q2` + - `Q3` +6. Приоритет выплат: + - сначала `Q1` + - потом `Q2` + - потом `Q3` +7. Частичные выплаты с минимальным пополнением `inflow_vault`. +8. Повторную покупку билета между выплатами. +9. Финальное погашение всех очередей. +10. Возврат максимально возможных остатков лампортов на базовый кошелёк. + +## Где смотреть подробный сценарий + +Актуальный подробный сценарий тестирования и его статус ведётся в: + +- `Dev_Docs/Pending_Features/2026-06-06_1659_shine_payments_e2e_перепись_и_q3.md` + +Этот файл в `shine-solana/shine/doc/` оставлен как постоянная заметка, что у программы есть отдельный e2e-план проверки.