diff --git a/Dev_Docs/Pending_Features/2026-06-03_1521_кнопка_настроить_сервер_и_devnet_topup.md b/Dev_Docs/Pending_Features/2026-06-03_1521_кнопка_настроить_сервер_и_devnet_topup.md
new file mode 100644
index 0000000..b23d816
--- /dev/null
+++ b/Dev_Docs/Pending_Features/2026-06-03_1521_кнопка_настроить_сервер_и_devnet_topup.md
@@ -0,0 +1,20 @@
+# Кнопка настройки сервера и DEVNET topup
+
+- краткое описание фичи:
+ На экране `entry-settings-view` добавлена кнопка `Настроить свой сервер`, открывающая `server-ui.html` в новой вкладке.
+ На страницах серверного UI добавлена кнопка открытия `devnet-topup-view` в новой вкладке с автоматической передачей `wallet` из device-адреса.
+
+- что именно проверять:
+ 1. На странице настроек входа есть кнопка `Настроить свой сервер`.
+ 2. Кнопка открывает `shine-UI/server-ui.html` в новой вкладке.
+ 3. На страницах `create-server-pda.html` и `update-server-pda.html` есть кнопка `Открыть пополнение DEVNET`.
+ 4. Если device public key заполнен, новая вкладка открывает `devnet-topup-view?wallet=...` с правильным адресом.
+ 5. Если device-адрес не введён, серверный UI показывает понятную ошибку и не открывает пустую ссылку.
+
+- ожидаемый результат:
+ 1. Переход в серверный UI с клиентской страницы настроек работает.
+ 2. Пополнение devnet из серверного UI открывается сразу на нужный адрес.
+ 3. Основной клиентский UI и серверные страницы не получают JS-ошибок при загрузке.
+
+- статус:
+ pending
diff --git a/VERSION.properties b/VERSION.properties
index e21b073..74bf9e1 100644
--- a/VERSION.properties
+++ b/VERSION.properties
@@ -1,2 +1,2 @@
-client.version=1.2.117
-server.version=1.2.109
+client.version=1.2.118
+server.version=1.2.110
diff --git a/shine-UI/js/pages/entry-settings-view.js b/shine-UI/js/pages/entry-settings-view.js
index ec1d2ab..8c59f48 100644
--- a/shine-UI/js/pages/entry-settings-view.js
+++ b/shine-UI/js/pages/entry-settings-view.js
@@ -129,6 +129,15 @@ export function render({ navigate }) {
const actions = document.createElement('div');
actions.className = 'auth-footer-actions';
+ const serverUiButton = document.createElement('button');
+ serverUiButton.className = 'ghost-btn';
+ serverUiButton.type = 'button';
+ serverUiButton.textContent = 'Настроить свой сервер';
+ serverUiButton.addEventListener('click', () => {
+ const url = new URL('server-ui.html', window.location.href);
+ window.open(url.toString(), '_blank', 'noopener');
+ });
+
const cancelButton = document.createElement('button');
cancelButton.className = 'ghost-btn';
cancelButton.type = 'button';
@@ -144,7 +153,7 @@ export function render({ navigate }) {
navigate('start-view');
});
- actions.append(cancelButton, saveButton);
+ actions.append(serverUiButton, cancelButton, saveButton);
const help = document.createElement('button');
help.className = 'help-fab';
diff --git a/shine-UI/server-ui/create-server-pda.html b/shine-UI/server-ui/create-server-pda.html
index df42d52..8745eab 100644
--- a/shine-UI/server-ui/create-server-pda.html
+++ b/shine-UI/server-ui/create-server-pda.html
@@ -28,6 +28,7 @@
.sol-ttl { font-size:12px; font-weight:600; color:#7dcc7d; }
.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%; }
@@ -112,6 +113,7 @@
Положите SOL на этот адрес перед регистрацией:
Это Solana-адрес device-ключа (public key в base58 = Solana-адрес). С него оплачивается создание PDA.
+
diff --git a/shine-UI/server-ui/js/create-server-pda-page.js b/shine-UI/server-ui/js/create-server-pda-page.js
index 550c50c..d6d80c5 100644
--- a/shine-UI/server-ui/js/create-server-pda-page.js
+++ b/shine-UI/server-ui/js/create-server-pda-page.js
@@ -4,6 +4,7 @@ import {
buildKeyBundleFromForm,
clearGenMessage,
clearStatus,
+ openDevnetTopup,
deriveKeyBundleFromPassword,
fillKeyFields,
parseLoginList,
@@ -30,6 +31,14 @@ const fieldMap = {
setupPasswordEye($('btnEye'), $('password'));
wireDeviceAddressPreview(fieldMap);
+$('btnTopupDevnet').addEventListener('click', () => {
+ try {
+ openDevnetTopup($('devPub').value);
+ } catch (error) {
+ setStatus($('status'), error?.message || String(error), 'error');
+ }
+});
+
$('btnGen').addEventListener('click', async () => {
clearGenMessage($('genMsg'));
clearStatus($('status'));
diff --git a/shine-UI/server-ui/js/server-ui-shared.js b/shine-UI/server-ui/js/server-ui-shared.js
index 2ef9ee6..7cb8841 100644
--- a/shine-UI/server-ui/js/server-ui-shared.js
+++ b/shine-UI/server-ui/js/server-ui-shared.js
@@ -194,3 +194,20 @@ export function wireDeviceAddressPreview(fieldMap) {
$(fieldMap.devPub).addEventListener('input', update);
update();
}
+
+export function buildDevnetTopupUrl(walletAddress) {
+ const cleanWallet = String(walletAddress || '').trim();
+ const url = new URL('../devnet-topup-view', window.location.href);
+ if (cleanWallet) {
+ url.searchParams.set('wallet', cleanWallet);
+ }
+ return url.toString();
+}
+
+export function openDevnetTopup(walletAddress) {
+ const cleanWallet = String(walletAddress || '').trim();
+ if (!cleanWallet) {
+ throw new Error('Сначала укажите device-адрес');
+ }
+ window.open(buildDevnetTopupUrl(cleanWallet), '_blank', 'noopener');
+}
diff --git a/shine-UI/server-ui/js/update-server-pda-page.js b/shine-UI/server-ui/js/update-server-pda-page.js
index bdc406a..41ad284 100644
--- a/shine-UI/server-ui/js/update-server-pda-page.js
+++ b/shine-UI/server-ui/js/update-server-pda-page.js
@@ -8,6 +8,7 @@ import {
fillKeyFields,
formatBigInt,
formatTimestamp,
+ openDevnetTopup,
parseLoginList,
setGenMessage,
setStatus,
@@ -34,6 +35,14 @@ let currentPda = null;
setupPasswordEye($('btnEye'), $('password'));
wireDeviceAddressPreview(fieldMap);
+$('btnTopupDevnet').addEventListener('click', () => {
+ try {
+ openDevnetTopup($('devPub').value);
+ } catch (error) {
+ setStatus($('status'), error?.message || String(error), 'error');
+ }
+});
+
$('btnGen').addEventListener('click', async () => {
clearGenMessage($('genMsg'));
clearStatus($('status'));
diff --git a/shine-UI/server-ui/update-server-pda.html b/shine-UI/server-ui/update-server-pda.html
index 93080c1..7c9c817 100644
--- a/shine-UI/server-ui/update-server-pda.html
+++ b/shine-UI/server-ui/update-server-pda.html
@@ -29,6 +29,7 @@
.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; }
.muted { font-size:12px; color:var(--text-muted); margin-bottom:14px; line-height:1.6; }
+ .sol-topup-btn { margin-top:10px; width:100%; }
@@ -126,6 +127,7 @@
Положите SOL на этот адрес перед обновлением:
Это Solana-адрес (base58) device-ключа. С него оплачивается транзакция.
+