SHA256
Показывать очередь билетов mainnet на тестовом UI
This commit is contained in:
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
client.version=1.2.334
|
client.version=1.2.335
|
||||||
server.version=1.2.306
|
server.version=1.2.307
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js';
|
import { renderHeader } from '../components/header.js';
|
||||||
|
import { defaultSolanaCluster } from '../deploy-config.js';
|
||||||
import { state } from '../state.js';
|
import { state } from '../state.js';
|
||||||
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.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_PROGRAM_ID = 'SHiPmXbM9Fs9khzRUW3TGKsS2W84aqaXTxs3ZkajW9v';
|
||||||
const SHINE_PAYMENTS_ORACLE_ACCOUNT = '7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE';
|
const SHINE_PAYMENTS_ORACLE_ACCOUNT = '7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE';
|
||||||
|
const SHINE_MAINNET_SOLANA_ENDPOINT = 'https://solana-rpc.publicnode.com';
|
||||||
const SHINE_PAYMENTS_SEEDS = {
|
const SHINE_PAYMENTS_SEEDS = {
|
||||||
config: 'shine_payments_config',
|
config: 'shine_payments_config',
|
||||||
coef: 'shine_payments_coef_limit',
|
coef: 'shine_payments_coef_limit',
|
||||||
@@ -15,6 +17,14 @@ const SHINE_PAYMENTS_SEEDS = {
|
|||||||
q3: 'shine_payments_q3_ticket',
|
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) {
|
function utf8Bytes(text) {
|
||||||
return new TextEncoder().encode(String(text || ''));
|
return new TextEncoder().encode(String(text || ''));
|
||||||
}
|
}
|
||||||
@@ -286,7 +296,18 @@ export function render({ navigate }) {
|
|||||||
result.className = 'card stack';
|
result.className = 'card stack';
|
||||||
result.innerHTML = `<p class="meta-muted" style="margin:0;">Введите номер билета и нажмите кнопку.</p>`;
|
result.innerHTML = `<p class="meta-muted" style="margin:0;">Введите номер билета и нажмите кнопку.</p>`;
|
||||||
|
|
||||||
|
const testDeploy = isTestDeployUi();
|
||||||
|
const mainnetRow = document.createElement('label');
|
||||||
|
mainnetRow.className = 'checkbox-row';
|
||||||
|
mainnetRow.innerHTML = `
|
||||||
|
<input type="checkbox" id="public-queue-mainnet-source" ${testDeploy ? 'checked' : ''} />
|
||||||
|
<span>Показывать данные mainnet (${SHINE_MAINNET_SOLANA_ENDPOINT})</span>
|
||||||
|
`;
|
||||||
|
mainnetRow.style.display = testDeploy ? '' : 'none';
|
||||||
|
const mainnetCheckbox = mainnetRow.querySelector('#public-queue-mainnet-source');
|
||||||
|
|
||||||
let lastCoreState = null;
|
let lastCoreState = null;
|
||||||
|
let lastEndpoint = '';
|
||||||
|
|
||||||
async function renderTicketInfo() {
|
async function renderTicketInfo() {
|
||||||
const raw = String(queryInput.value || '').trim();
|
const raw = String(queryInput.value || '').trim();
|
||||||
@@ -297,8 +318,12 @@ export function render({ navigate }) {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const parsed = parseSupportTicketInput(raw);
|
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;
|
lastCoreState = core;
|
||||||
|
lastEndpoint = endpoint;
|
||||||
const solana = await loadSolanaWeb3();
|
const solana = await loadSolanaWeb3();
|
||||||
const ticketPdaSeed = queueSeedFor(parsed.queueId);
|
const ticketPdaSeed = queueSeedFor(parsed.queueId);
|
||||||
const ticketIndexBytes = u64ToBytes(parsed.index);
|
const ticketIndexBytes = u64ToBytes(parsed.index);
|
||||||
@@ -330,7 +355,7 @@ export function render({ navigate }) {
|
|||||||
<div><b>Сумма этого билета:</b> ${formatUsdCentsText(ticket.payoutUsdCents)} USD</div>
|
<div><b>Сумма этого билета:</b> ${formatUsdCentsText(ticket.payoutUsdCents)} USD</div>
|
||||||
<div><b>Накоплено до этого билета:</b> ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него</div>
|
<div><b>Накоплено до этого билета:</b> ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него</div>
|
||||||
`;
|
`;
|
||||||
status.textContent = `Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден.`;
|
status.textContent = `Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден. Источник Solana: ${endpoint}`;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
result.innerHTML = `<p class="meta-muted" style="margin:0;">${String(error?.message || 'Не удалось загрузить билет')}</p>`;
|
result.innerHTML = `<p class="meta-muted" style="margin:0;">${String(error?.message || 'Не удалось загрузить билет')}</p>`;
|
||||||
status.textContent = `Не удалось посмотреть билет: ${error?.message || 'unknown'}`;
|
status.textContent = `Не удалось посмотреть билет: ${error?.message || 'unknown'}`;
|
||||||
@@ -340,6 +365,11 @@ export function render({ navigate }) {
|
|||||||
actions.querySelector('#public-queue-load')?.addEventListener('click', () => {
|
actions.querySelector('#public-queue-load')?.addEventListener('click', () => {
|
||||||
void renderTicketInfo();
|
void renderTicketInfo();
|
||||||
});
|
});
|
||||||
|
mainnetCheckbox?.addEventListener('change', () => {
|
||||||
|
lastCoreState = null;
|
||||||
|
lastEndpoint = '';
|
||||||
|
status.textContent = `Источник Solana: ${resolveQueueEndpoint(Boolean(testDeploy && mainnetCheckbox.checked))}`;
|
||||||
|
});
|
||||||
actions.querySelector('#public-queue-reset')?.addEventListener('click', () => {
|
actions.querySelector('#public-queue-reset')?.addEventListener('click', () => {
|
||||||
queryInput.value = '';
|
queryInput.value = '';
|
||||||
result.innerHTML = `<p class="meta-muted" style="margin:0;">Введите номер билета и нажмите кнопку.</p>`;
|
result.innerHTML = `<p class="meta-muted" style="margin:0;">Введите номер билета и нажмите кнопку.</p>`;
|
||||||
@@ -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(
|
screen.append(
|
||||||
renderHeader({
|
renderHeader({
|
||||||
title: 'Очередь билета',
|
title: 'Очередь билета',
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js';
|
import { renderHeader } from '../components/header.js';
|
||||||
|
import { defaultSolanaCluster } from '../deploy-config.js';
|
||||||
import { authService, state } from '../state.js';
|
import { authService, state } from '../state.js';
|
||||||
import {
|
import {
|
||||||
formatSol,
|
formatSol,
|
||||||
@@ -65,6 +66,7 @@ function sessionArgsOrThrow() {
|
|||||||
|
|
||||||
const SHINE_PAYMENTS_PROGRAM_ID = 'SHiPmXbM9Fs9khzRUW3TGKsS2W84aqaXTxs3ZkajW9v';
|
const SHINE_PAYMENTS_PROGRAM_ID = 'SHiPmXbM9Fs9khzRUW3TGKsS2W84aqaXTxs3ZkajW9v';
|
||||||
const SHINE_PAYMENTS_ORACLE_ACCOUNT = '7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE';
|
const SHINE_PAYMENTS_ORACLE_ACCOUNT = '7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE';
|
||||||
|
const SHINE_MAINNET_SOLANA_ENDPOINT = 'https://solana-rpc.publicnode.com';
|
||||||
const SHINE_PAYMENTS_SEEDS = {
|
const SHINE_PAYMENTS_SEEDS = {
|
||||||
config: 'shine_payments_config',
|
config: 'shine_payments_config',
|
||||||
coef: 'shine_payments_coef_limit',
|
coef: 'shine_payments_coef_limit',
|
||||||
@@ -84,6 +86,14 @@ const SUPPORT_TICKET_HELP_TEXT = [
|
|||||||
'Номер билета нужно сохранить отдельно: именно по нему удобно отслеживать, когда он дойдет до выплаты.',
|
'Номер билета нужно сохранить отдельно: именно по нему удобно отслеживать, когда он дойдет до выплаты.',
|
||||||
].join('\n');
|
].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) {
|
function utf8Bytes(text) {
|
||||||
return new TextEncoder().encode(String(text || ''));
|
return new TextEncoder().encode(String(text || ''));
|
||||||
}
|
}
|
||||||
@@ -697,6 +707,16 @@ export function render({ navigate }) {
|
|||||||
queryInput.spellcheck = false;
|
queryInput.spellcheck = false;
|
||||||
styleSupportInputField(queryInput);
|
styleSupportInputField(queryInput);
|
||||||
|
|
||||||
|
const testDeploy = isTestDeployUi();
|
||||||
|
const mainnetRow = document.createElement('label');
|
||||||
|
mainnetRow.className = 'checkbox-row';
|
||||||
|
mainnetRow.innerHTML = `
|
||||||
|
<input type="checkbox" id="support-ticket-mainnet-source" ${testDeploy ? 'checked' : ''} />
|
||||||
|
<span>Показывать данные mainnet (${SHINE_MAINNET_SOLANA_ENDPOINT})</span>
|
||||||
|
`;
|
||||||
|
mainnetRow.style.display = testDeploy ? '' : 'none';
|
||||||
|
const mainnetCheckbox = mainnetRow.querySelector('#support-ticket-mainnet-source');
|
||||||
|
|
||||||
const actions = document.createElement('div');
|
const actions = document.createElement('div');
|
||||||
actions.className = 'row';
|
actions.className = 'row';
|
||||||
actions.innerHTML = `
|
actions.innerHTML = `
|
||||||
@@ -711,6 +731,7 @@ export function render({ navigate }) {
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
let lastCoreState = null;
|
let lastCoreState = null;
|
||||||
|
let lastEndpoint = '';
|
||||||
|
|
||||||
const renderTicketInfo = async () => {
|
const renderTicketInfo = async () => {
|
||||||
const raw = String(queryInput.value || '').trim();
|
const raw = String(queryInput.value || '').trim();
|
||||||
@@ -720,8 +741,12 @@ export function render({ navigate }) {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const parsed = parseSupportTicketInput(raw);
|
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;
|
lastCoreState = core;
|
||||||
|
lastEndpoint = endpoint;
|
||||||
const solana = await loadSolanaWeb3();
|
const solana = await loadSolanaWeb3();
|
||||||
const ticketPdaSeed = queueSeedFor(parsed.queueId);
|
const ticketPdaSeed = queueSeedFor(parsed.queueId);
|
||||||
const ticketIndexBytes = u64ToBytes(parsed.index);
|
const ticketIndexBytes = u64ToBytes(parsed.index);
|
||||||
@@ -752,7 +777,7 @@ export function render({ navigate }) {
|
|||||||
<div><b>Сумма этого билета:</b> ${formatUsdCentsText(ticket.payoutUsdCents)} USD</div>
|
<div><b>Сумма этого билета:</b> ${formatUsdCentsText(ticket.payoutUsdCents)} USD</div>
|
||||||
<div><b>Накоплено до этого билета:</b> ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него</div>
|
<div><b>Накоплено до этого билета:</b> ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него</div>
|
||||||
`;
|
`;
|
||||||
setStatus(`Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден.`);
|
setStatus(`Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден. Источник Solana: ${endpoint}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
result.innerHTML = `<p class="meta-muted" style="margin:0;">${String(error?.message || 'Не удалось загрузить билет')}</p>`;
|
result.innerHTML = `<p class="meta-muted" style="margin:0;">${String(error?.message || 'Не удалось загрузить билет')}</p>`;
|
||||||
setStatus(`Не удалось посмотреть билет: ${error?.message || 'unknown'}`);
|
setStatus(`Не удалось посмотреть билет: ${error?.message || 'unknown'}`);
|
||||||
@@ -767,9 +792,14 @@ export function render({ navigate }) {
|
|||||||
result.innerHTML = `<p class="meta-muted" style="margin:0;">Введите номер билета и нажмите кнопку.</p>`;
|
result.innerHTML = `<p class="meta-muted" style="margin:0;">Введите номер билета и нажмите кнопку.</p>`;
|
||||||
setStatus('Поле билета очищено.');
|
setStatus('Поле билета очищено.');
|
||||||
});
|
});
|
||||||
|
mainnetCheckbox?.addEventListener('change', () => {
|
||||||
|
lastCoreState = null;
|
||||||
|
lastEndpoint = '';
|
||||||
|
setStatus(`Источник Solana: ${resolveSupportQueueEndpoint(Boolean(testDeploy && mainnetCheckbox.checked))}`);
|
||||||
|
});
|
||||||
|
|
||||||
content.append(backBtn, card, inputLabel, queryInput, actions, result);
|
content.append(backBtn, card, mainnetRow, inputLabel, queryInput, actions, result);
|
||||||
setStatus('Просмотр билета готов. Введите номер в нужном формате.');
|
setStatus(`Просмотр билета готов. Источник Solana: ${resolveSupportQueueEndpoint(Boolean(testDeploy && mainnetCheckbox?.checked))}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function renderSupportBuyIntro() {
|
async function renderSupportBuyIntro() {
|
||||||
|
|||||||
Reference in New Issue
Block a user