diff --git a/Dev_Docs/Pending_Features/2026-06-03_1648_диагностика_server_pda_и_device_balance.md b/Dev_Docs/Pending_Features/2026-06-03_1648_диагностика_server_pda_и_device_balance.md
new file mode 100644
index 0000000..4cabd96
--- /dev/null
+++ b/Dev_Docs/Pending_Features/2026-06-03_1648_диагностика_server_pda_и_device_balance.md
@@ -0,0 +1,17 @@
+# Диагностика ключей server PDA и баланс device
+
+- статус: pending
+- кратко: на странице обновления server PDA добавлена сверка ожидаемых ключей с уже загруженной PDA, предупреждение о неверном пароле, кнопка показа баланса device-аккаунта и уточнение, что create/update оплачиваются с deviceKey.
+
+## Что проверять
+- На `update-server-pda.html` загрузить существующую PDA и убедиться, что видны ожидаемые `root/blockchain/device` public key.
+- Ввести правильный пароль и нажать `Сгенерировать`: должно появиться сообщение, что ключи совпадают.
+- Ввести неверный пароль и нажать `Сгенерировать`: должно появиться сообщение, что ключи не совпали и пароль, вероятно, неверный.
+- На `create-server-pda.html` и `update-server-pda.html` нажать `Показать / обновить баланс device` и убедиться, что баланс читается по текущему `devPub`.
+- Повторить `update_user_pda` после увеличения `heap frame` и проверить, ушла ли ошибка `memory allocation failed`.
+
+## Ожидаемый результат
+- Пользователь видит, какие именно public key должны получиться для загруженной PDA.
+- Ошибка неправильного пароля выявляется до отправки транзакции.
+- Баланс device-кошелька читается прямо со страницы.
+- Если проблема `OOM` была только в размере heap frame/compute budget клиента, `update_user_pda` начинает проходить.
diff --git a/Dev_Docs/Инициализация_Solana_регистрации/README.md b/Dev_Docs/Инициализация_Solana_регистрации/README.md
index 450c10c..72375a5 100644
--- a/Dev_Docs/Инициализация_Solana_регистрации/README.md
+++ b/Dev_Docs/Инициализация_Solana_регистрации/README.md
@@ -82,10 +82,17 @@ anchor deploy -p shine_users
- seed: `shine_users_economy_config`
- program: `FZS1YctoeEhCkZ5VTjsysUFAXR8CqxYztcLboXcg2Rpm`
+## Кто оплачивает create/update user_pda
+
+- И обычная регистрация `create_user_pda`, и последующее `update_user_pda` оплачиваются с `deviceKey`.
+- В UI это означает, что Solana fee payer всегда берётся из `device`-ключа пользователя/сервера.
+- `rootKey` нужен для подписи unsigned PDA-записи, но не оплачивает транзакцию.
+- Для server UI это особенно важно: перед `create` и `update` нужно пополнять именно Solana-адрес `deviceKey`.
+
## Важно
- `init_users_economy_config` выполняется один раз на программу.
Если PDA уже создан, повторный вызов вернёт ошибку "already initialized" (это нормальное поведение).
-- Серверные приватные ключи для Solana не используются: подписание делается кошельком пользователя в UI.
+- Серверные приватные ключи для Solana не используются как отдельный backend-wallet: в UI/server UI транзакцию оплачивает именно `deviceKey`, а содержимое записи подписывает `rootKey`.
- `shine_users` внутри `create_user_pda` требует корректный адрес `shine_login_guard` для CPI-классификации логина.
Несовпадение адреса приведёт к ошибке регистрации.
diff --git a/VERSION.properties b/VERSION.properties
index 8b8b226..60c3ce7 100644
--- a/VERSION.properties
+++ b/VERSION.properties
@@ -1,2 +1,2 @@
-client.version=1.2.120
-server.version=1.2.112
+client.version=1.2.121
+server.version=1.2.113
diff --git a/shine-UI/js/services/shine-user-pda-service.js b/shine-UI/js/services/shine-user-pda-service.js
index 8f38e9b..dead6a3 100644
--- a/shine-UI/js/services/shine-user-pda-service.js
+++ b/shine-UI/js/services/shine-user-pda-service.js
@@ -913,8 +913,8 @@ export async function updateShineUserPdaOnSolana({
],
data: ixData,
});
- const computeIx = solana.ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });
- const heapIx = solana.ComputeBudgetProgram.requestHeapFrame({ bytes: 131_072 });
+ const computeIx = solana.ComputeBudgetProgram.setComputeUnitLimit({ units: 800_000 });
+ const heapIx = solana.ComputeBudgetProgram.requestHeapFrame({ bytes: 262_144 });
const signature = await solana.sendAndConfirmTransaction(
connection,
diff --git a/shine-UI/server-ui/create-server-pda.html b/shine-UI/server-ui/create-server-pda.html
index 1de37ce..99e2248 100644
--- a/shine-UI/server-ui/create-server-pda.html
+++ b/shine-UI/server-ui/create-server-pda.html
@@ -29,6 +29,8 @@
.sol-adr { font-family:monospace; font-size:12px; word-break:break-all; margin-top:4px; }
.sol-ht { font-size:11px; color:var(--text-muted); margin-top:4px; }
.sol-topup-btn { margin-top:10px; width:100%; }
+ .sol-balance-btn { margin-top:10px; width:100%; }
+ .sol-balance { font-size:11px; color:var(--text-muted); margin-top:8px; word-break:break-all; }
@@ -112,8 +114,10 @@
Положите SOL на этот адрес перед регистрацией:
-
Это Solana-адрес device-ключа (public key в base58 = Solana-адрес). С него оплачивается создание PDA.
+
Это Solana-адрес device-ключа (public key в base58 = Solana-адрес). С него оплачиваются и создание, и обновление PDA.
Это Solana-адрес (base58) device-ключа. С него оплачивается транзакция.
+
+
Баланс device ещё не запрашивался.
+
+
+
Какие ключи ожидаются по уже загруженной PDA
+
+
Ожидаемый root public key
+
+
+
+
Ожидаемый blockchain public key
+
+
+
+
Ожидаемый device public key
+
+
+
+
diff --git a/shine-solana/shine/doc/SHiNE-user-format-v.1.0.md b/shine-solana/shine/doc/SHiNE-user-format-v.1.0.md
index e4cebb8..1efee8c 100644
--- a/shine-solana/shine/doc/SHiNE-user-format-v.1.0.md
+++ b/shine-solana/shine/doc/SHiNE-user-format-v.1.0.md
@@ -32,6 +32,12 @@
Один логин соответствует одной `user_pda`.
+## 2.1. Кто оплачивает create/update PDA
+
+- Инструкции `create_user_pda` и `update_user_pda` оплачиваются с `device_key`.
+- `root_key` используется для подписи unsigned части записи через Ed25519 instruction и не является fee payer.
+- Для server PDA это правило то же самое: пополнять SOL нужно на адрес `device_key`.
+
## 3. Общие правила кодирования
- Числа кодируются в Little Endian.