Перевести тестовый контур на t.shineup.me

This commit is contained in:
AidarKC
2026-06-25 13:44:22 +04:00
parent 112ab4d5d5
commit f0e1ab3af8
22 changed files with 131 additions and 58 deletions
@@ -14,6 +14,7 @@ import {
getBalanceSol,
getTopupSiteUrl,
} from '../services/solana-wallet-service.js';
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
import {
formatSolanaErrorDetails,
isUserAlreadyExistsSolanaError,
@@ -185,7 +186,7 @@ export function render({ navigate }) {
const raw = atob(publicKeyB64);
const bytes = new Uint8Array(raw.length);
for (let i = 0; i < raw.length; i++) bytes[i] = raw.charCodeAt(i);
const { PublicKey } = await import('https://esm.sh/@solana/web3.js@1.98.4');
const { PublicKey } = await loadSolanaWeb3();
const address = new PublicKey(bytes).toBase58();
state.registrationPayment.walletAddress = address;
walletValue.value = address;
+2 -1
View File
@@ -5,13 +5,14 @@ import {
SOLANA_CLUSTER,
} from '../solana-programs.js';
import { state } from '../state.js';
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
export const pageMeta = { id: 'solana-users-init-view', title: 'Solana Init (users)' };
let solanaLibPromise = null;
function loadSolanaLib() {
if (!solanaLibPromise) {
solanaLibPromise = import('https://esm.sh/@solana/web3.js@1.98.4?bundle');
solanaLibPromise = loadSolanaWeb3();
}
return solanaLibPromise;
}
+2 -1
View File
@@ -6,6 +6,7 @@ import {
getTopupSiteUrl,
requestAirdropSol,
} from '../services/solana-wallet-service.js';
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
export const pageMeta = { id: 'topup-view', title: 'Пополнение счета', showAppChrome: false };
@@ -20,7 +21,7 @@ async function clientWalletAddressFromBundle() {
const raw = atob(keyBundle.clientPair.publicKeyB64);
const bytes = new Uint8Array(raw.length);
for (let i = 0; i < raw.length; i += 1) bytes[i] = raw.charCodeAt(i);
const { PublicKey } = await import('https://esm.sh/@solana/web3.js@1.98.4');
const { PublicKey } = await loadSolanaWeb3();
return new PublicKey(bytes).toBase58();
}
@@ -6,6 +6,7 @@ import {
SHINE_USERS_ECONOMY_CONFIG_SEED,
SHINE_USERS_PROGRAM_ID,
} from '../solana-programs.js';
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
const MAGIC = 'SHiNE';
const LAST_BLOCK_STATE_PREFIX = 'SHiNE_LAST_BLOCK';
@@ -30,7 +31,7 @@ const SESSION_TYPE_HOMESERVER = 100;
let solanaLibPromise = null;
function loadSolanaLib() {
if (!solanaLibPromise) solanaLibPromise = import('https://esm.sh/@solana/web3.js@1.98.4?bundle');
if (!solanaLibPromise) solanaLibPromise = loadSolanaWeb3();
return solanaLibPromise;
}
@@ -3,6 +3,7 @@ import {
SHINE_USERS_PROGRAM_ID,
SHINE_LOGIN_GUARD_PROGRAM_ID,
} from '../solana-programs.js';
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
const CLASSIFY_LOGIN_INSTRUCTION_TAG = 1;
const PRECHECK_SIM_PAYER = 'FUc28vNixp7F3nnkpGVt6nuJbgvJ4429v4B5wS52Df6P';
@@ -10,7 +11,7 @@ const SHINE_USERS_USER_PDA_SEED_PREFIX = 'user_login=';
let solanaLibPromise = null;
function loadSolanaLib() {
if (!solanaLibPromise) solanaLibPromise = import('https://esm.sh/@solana/web3.js@1.98.4?bundle');
if (!solanaLibPromise) solanaLibPromise = loadSolanaWeb3();
return solanaLibPromise;
}
@@ -1,6 +1,7 @@
import { extractClientKey32FromStoredValue } from './client-key-utils.js';
import { loadEncryptedUserSecrets } from './key-vault.js';
import { SOLANA_ENDPOINT_DEFAULT } from '../solana-programs.js';
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
const DEFAULT_SOLANA_ENDPOINT = SOLANA_ENDPOINT_DEFAULT;
const TOPUP_SITE_URL = '/devnet-topup-view';
@@ -24,7 +25,7 @@ function normalizeEndpoint(url) {
async function loadSolanaLib() {
if (!solanaLibPromise) {
solanaLibPromise = import('https://esm.sh/@solana/web3.js@1.98.4?bundle');
solanaLibPromise = loadSolanaWeb3();
}
return solanaLibPromise;
}
+45
View File
@@ -0,0 +1,45 @@
const SOLANA_WEB3_SCRIPT_SRC = './solana-web3.iife.min.js';
let solanaWeb3Promise = null;
function getExistingScript() {
return document.querySelector('script[data-shine-solana-web3="1"]');
}
function resolveScriptUrl() {
return new URL(SOLANA_WEB3_SCRIPT_SRC, import.meta.url).toString();
}
export function loadSolanaWeb3() {
if (typeof window === 'undefined' || typeof document === 'undefined') {
return Promise.reject(new Error('Solana Web3 loader доступен только в браузере'));
}
if (window.solanaWeb3) {
return Promise.resolve(window.solanaWeb3);
}
if (!solanaWeb3Promise) {
solanaWeb3Promise = new Promise((resolve, reject) => {
const existing = getExistingScript();
if (existing) {
existing.addEventListener('load', () => resolve(window.solanaWeb3), { once: true });
existing.addEventListener('error', () => reject(new Error('Не удалось загрузить локальный solana-web3.js')), { once: true });
return;
}
const script = document.createElement('script');
script.src = resolveScriptUrl();
script.async = true;
script.dataset.shineSolanaWeb3 = '1';
script.onload = () => {
if (!window.solanaWeb3) {
reject(new Error('Локальный solana-web3.js загружен, но объект solanaWeb3 недоступен'));
return;
}
resolve(window.solanaWeb3);
};
script.onerror = () => reject(new Error('Не удалось загрузить локальный solana-web3.js'));
document.head.appendChild(script);
});
}
return solanaWeb3Promise;
}
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -61,11 +61,11 @@
<div class="hint">Только a-z, 0-9, _ · без точки · макс. 20 символов</div>
</div>
<div class="field">
<label>Адрес сервера (URL)</label>
<label>Арес сервера (URL) например shineup.me</label>
<input type="text" id="serverAddress" placeholder="Адрес сервера" />
</div>
<div class="field">
<label>Серверы синхронизации (sync_servers)</label>
<label>Логины серверов c которыми будет синхронизировать записи в блокчейн этот сервер (Например shineupme)</label>
<textarea id="syncServers" placeholder="По одному логину на строку (можно оставить пустым)"></textarea>
</div>
<div class="field">
+2 -2
View File
@@ -86,11 +86,11 @@
<div class="card">
<h2>Новые параметры сервера</h2>
<div class="field">
<label>Новый адрес сервера (URL)</label>
<label>Арес сервера (URL) например shineup.me</label>
<input type="text" id="serverAddress" placeholder="Адрес сервера" />
</div>
<div class="field">
<label>Новые серверы синхронизации (sync_servers)</label>
<label>Логины серверов c которыми будет синхронизировать записи в блокчейн этот сервер (Например shineupme)</label>
<textarea id="syncServers" placeholder="По одному логину на строку (можно оставить пустым)"></textarea>
</div>
</div>