From 968d85d73858a9e63b45e920ec08818716684c45d451a41bf7c2aa7bad0a99b5 Mon Sep 17 00:00:00 2001
From: AidarKC
Date: Mon, 20 Jul 2026 21:04:11 +0400
Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2?=
=?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D1=8C?=
=?UTF-8?q?=20=D0=B1=D0=B8=D0=BB=D0=B5=D1=82=D0=BE=D0=B2=20mainnet=20?=
=?UTF-8?q?=D0=BD=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=D0=BE=D0=BC?=
=?UTF-8?q?=20UI?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
VERSION.properties | 4 +-
.../js/pages/public-support-queue-view.js | 36 ++++++++++++++++--
shine-UI/js/pages/wallet-view.js | 38 +++++++++++++++++--
3 files changed, 69 insertions(+), 9 deletions(-)
diff --git a/VERSION.properties b/VERSION.properties
index e9ff063c..fb7cd911 100644
--- a/VERSION.properties
+++ b/VERSION.properties
@@ -1,2 +1,2 @@
-client.version=1.2.334
-server.version=1.2.306
+client.version=1.2.335
+server.version=1.2.307
diff --git a/shine-UI/js/pages/public-support-queue-view.js b/shine-UI/js/pages/public-support-queue-view.js
index f775a5a5..b61d2048 100644
--- a/shine-UI/js/pages/public-support-queue-view.js
+++ b/shine-UI/js/pages/public-support-queue-view.js
@@ -1,4 +1,5 @@
import { renderHeader } from '../components/header.js';
+import { defaultSolanaCluster } from '../deploy-config.js';
import { state } from '../state.js';
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
@@ -6,6 +7,7 @@ export const pageMeta = { id: 'queue', title: 'Очередь билета' };
const SHINE_PAYMENTS_PROGRAM_ID = 'SHiPmXbM9Fs9khzRUW3TGKsS2W84aqaXTxs3ZkajW9v';
const SHINE_PAYMENTS_ORACLE_ACCOUNT = '7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE';
+const SHINE_MAINNET_SOLANA_ENDPOINT = 'https://solana-rpc.publicnode.com';
const SHINE_PAYMENTS_SEEDS = {
config: 'shine_payments_config',
coef: 'shine_payments_coef_limit',
@@ -15,6 +17,14 @@ const SHINE_PAYMENTS_SEEDS = {
q3: 'shine_payments_q3_ticket',
};
+function isTestDeployUi() {
+ return String(defaultSolanaCluster || '').trim().toLowerCase() !== 'mainnet-beta';
+}
+
+function resolveQueueEndpoint(useMainnetQueue) {
+ return useMainnetQueue ? SHINE_MAINNET_SOLANA_ENDPOINT : state.entrySettings.solanaServer;
+}
+
function utf8Bytes(text) {
return new TextEncoder().encode(String(text || ''));
}
@@ -286,7 +296,18 @@ export function render({ navigate }) {
result.className = 'card stack';
result.innerHTML = `
Введите номер билета и нажмите кнопку.
`;
+ const testDeploy = isTestDeployUi();
+ const mainnetRow = document.createElement('label');
+ mainnetRow.className = 'checkbox-row';
+ mainnetRow.innerHTML = `
+
+ Показывать данные mainnet (${SHINE_MAINNET_SOLANA_ENDPOINT})
+ `;
+ mainnetRow.style.display = testDeploy ? '' : 'none';
+ const mainnetCheckbox = mainnetRow.querySelector('#public-queue-mainnet-source');
+
let lastCoreState = null;
+ let lastEndpoint = '';
async function renderTicketInfo() {
const raw = String(queryInput.value || '').trim();
@@ -297,8 +318,12 @@ export function render({ navigate }) {
}
try {
const parsed = parseSupportTicketInput(raw);
- const core = lastCoreState || await loadSupportPaymentsCore(state.entrySettings.solanaServer);
+ const endpoint = resolveQueueEndpoint(Boolean(testDeploy && mainnetCheckbox?.checked));
+ const core = lastCoreState && lastEndpoint === endpoint
+ ? lastCoreState
+ : await loadSupportPaymentsCore(endpoint);
lastCoreState = core;
+ lastEndpoint = endpoint;
const solana = await loadSolanaWeb3();
const ticketPdaSeed = queueSeedFor(parsed.queueId);
const ticketIndexBytes = u64ToBytes(parsed.index);
@@ -330,7 +355,7 @@ export function render({ navigate }) {
Сумма этого билета: ${formatUsdCentsText(ticket.payoutUsdCents)} USD
Накоплено до этого билета: ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него
`;
- status.textContent = `Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден.`;
+ status.textContent = `Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден. Источник Solana: ${endpoint}`;
} catch (error) {
result.innerHTML = `${String(error?.message || 'Не удалось загрузить билет')}
`;
status.textContent = `Не удалось посмотреть билет: ${error?.message || 'unknown'}`;
@@ -340,6 +365,11 @@ export function render({ navigate }) {
actions.querySelector('#public-queue-load')?.addEventListener('click', () => {
void renderTicketInfo();
});
+ mainnetCheckbox?.addEventListener('change', () => {
+ lastCoreState = null;
+ lastEndpoint = '';
+ status.textContent = `Источник Solana: ${resolveQueueEndpoint(Boolean(testDeploy && mainnetCheckbox.checked))}`;
+ });
actions.querySelector('#public-queue-reset')?.addEventListener('click', () => {
queryInput.value = '';
result.innerHTML = `Введите номер билета и нажмите кнопку.
`;
@@ -352,7 +382,7 @@ export function render({ navigate }) {
}
});
- content.append(card, inputLabel, queryInput, actions, result, status);
+ content.append(card, mainnetRow, inputLabel, queryInput, actions, result, status);
screen.append(
renderHeader({
title: 'Очередь билета',
diff --git a/shine-UI/js/pages/wallet-view.js b/shine-UI/js/pages/wallet-view.js
index 01da7f7d..211c2549 100644
--- a/shine-UI/js/pages/wallet-view.js
+++ b/shine-UI/js/pages/wallet-view.js
@@ -1,4 +1,5 @@
import { renderHeader } from '../components/header.js';
+import { defaultSolanaCluster } from '../deploy-config.js';
import { authService, state } from '../state.js';
import {
formatSol,
@@ -65,6 +66,7 @@ function sessionArgsOrThrow() {
const SHINE_PAYMENTS_PROGRAM_ID = 'SHiPmXbM9Fs9khzRUW3TGKsS2W84aqaXTxs3ZkajW9v';
const SHINE_PAYMENTS_ORACLE_ACCOUNT = '7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE';
+const SHINE_MAINNET_SOLANA_ENDPOINT = 'https://solana-rpc.publicnode.com';
const SHINE_PAYMENTS_SEEDS = {
config: 'shine_payments_config',
coef: 'shine_payments_coef_limit',
@@ -84,6 +86,14 @@ const SUPPORT_TICKET_HELP_TEXT = [
'Номер билета нужно сохранить отдельно: именно по нему удобно отслеживать, когда он дойдет до выплаты.',
].join('\n');
+function isTestDeployUi() {
+ return String(defaultSolanaCluster || '').trim().toLowerCase() !== 'mainnet-beta';
+}
+
+function resolveSupportQueueEndpoint(useMainnetQueue) {
+ return useMainnetQueue ? SHINE_MAINNET_SOLANA_ENDPOINT : state.entrySettings.solanaServer;
+}
+
function utf8Bytes(text) {
return new TextEncoder().encode(String(text || ''));
}
@@ -697,6 +707,16 @@ export function render({ navigate }) {
queryInput.spellcheck = false;
styleSupportInputField(queryInput);
+ const testDeploy = isTestDeployUi();
+ const mainnetRow = document.createElement('label');
+ mainnetRow.className = 'checkbox-row';
+ mainnetRow.innerHTML = `
+
+ Показывать данные mainnet (${SHINE_MAINNET_SOLANA_ENDPOINT})
+ `;
+ mainnetRow.style.display = testDeploy ? '' : 'none';
+ const mainnetCheckbox = mainnetRow.querySelector('#support-ticket-mainnet-source');
+
const actions = document.createElement('div');
actions.className = 'row';
actions.innerHTML = `
@@ -711,6 +731,7 @@ export function render({ navigate }) {
`;
let lastCoreState = null;
+ let lastEndpoint = '';
const renderTicketInfo = async () => {
const raw = String(queryInput.value || '').trim();
@@ -720,8 +741,12 @@ export function render({ navigate }) {
}
try {
const parsed = parseSupportTicketInput(raw);
- const core = lastCoreState || await loadSupportPaymentsCore(state.entrySettings.solanaServer);
+ const endpoint = resolveSupportQueueEndpoint(Boolean(testDeploy && mainnetCheckbox?.checked));
+ const core = lastCoreState && lastEndpoint === endpoint
+ ? lastCoreState
+ : await loadSupportPaymentsCore(endpoint);
lastCoreState = core;
+ lastEndpoint = endpoint;
const solana = await loadSolanaWeb3();
const ticketPdaSeed = queueSeedFor(parsed.queueId);
const ticketIndexBytes = u64ToBytes(parsed.index);
@@ -752,7 +777,7 @@ export function render({ navigate }) {
Сумма этого билета: ${formatUsdCentsText(ticket.payoutUsdCents)} USD
Накоплено до этого билета: ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него
`;
- setStatus(`Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден.`);
+ setStatus(`Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден. Источник Solana: ${endpoint}`);
} catch (error) {
result.innerHTML = `${String(error?.message || 'Не удалось загрузить билет')}
`;
setStatus(`Не удалось посмотреть билет: ${error?.message || 'unknown'}`);
@@ -767,9 +792,14 @@ export function render({ navigate }) {
result.innerHTML = `Введите номер билета и нажмите кнопку.
`;
setStatus('Поле билета очищено.');
});
+ mainnetCheckbox?.addEventListener('change', () => {
+ lastCoreState = null;
+ lastEndpoint = '';
+ setStatus(`Источник Solana: ${resolveSupportQueueEndpoint(Boolean(testDeploy && mainnetCheckbox.checked))}`);
+ });
- content.append(backBtn, card, inputLabel, queryInput, actions, result);
- setStatus('Просмотр билета готов. Введите номер в нужном формате.');
+ content.append(backBtn, card, mainnetRow, inputLabel, queryInput, actions, result);
+ setStatus(`Просмотр билета готов. Источник Solana: ${resolveSupportQueueEndpoint(Boolean(testDeploy && mainnetCheckbox?.checked))}`);
}
async function renderSupportBuyIntro() {