import { renderHeader } from '../components/header.js'; import { formatSol, getBalanceSol, transferSol, createSolanaWalletFromPrivateBase58 } from '../services/solana-wallet-service.js'; import { state } from '../state.js'; export const pageMeta = { id: 'devnet-topup-view', title: 'Пополнение DEVNET', showAppChrome: false }; const SENDER_PRIVATE_32_BASE58 = '6xqAuKYvA8qrCdAkcw7Y8aMgvBnYk8JLxWLma5BzbAvu'; const TRANSFER_AMOUNT_SOL = 0.01; function readWalletFromUrl() { try { const url = new URL(window.location.href); return String(url.searchParams.get('wallet') || '').trim(); } catch { return ''; } } export function render({ navigate }) { const screen = document.createElement('section'); screen.className = 'stack'; const targetWallet = readWalletFromUrl(); const senderBox = document.createElement('div'); senderBox.className = 'card stack'; senderBox.innerHTML = ` Тестовый DEVNET-кошелёк

Адрес: ...

Баланс: ...

`; const targetBox = document.createElement('div'); targetBox.className = 'card stack'; targetBox.innerHTML = ` Кошелёк получателя

${targetWallet || 'Не передан параметр wallet'}

Сумма перевода: ${TRANSFER_AMOUNT_SOL} SOL

`; const status = document.createElement('p'); status.className = 'meta-muted'; status.textContent = 'Готово к пополнению.'; const fillBtn = document.createElement('button'); fillBtn.className = 'primary-btn'; fillBtn.type = 'button'; fillBtn.textContent = `Пополнить на ${TRANSFER_AMOUNT_SOL} SOL`; const backBtn = document.createElement('button'); backBtn.className = 'secondary-btn'; backBtn.type = 'button'; backBtn.textContent = 'Назад'; backBtn.addEventListener('click', () => navigate('registration-payment-view')); const actions = document.createElement('div'); actions.className = 'auth-footer-actions'; actions.append(fillBtn, backBtn); let senderAddress = ''; let senderKeypair = null; const updateSenderBalance = async () => { if (!senderAddress) return; const endpoint = state.entrySettings.solanaServer; const balance = await getBalanceSol({ endpoint, address: senderAddress }); const senderBalanceEl = senderBox.querySelector('#devnet-topup-sender-balance'); if (senderBalanceEl) senderBalanceEl.textContent = `Баланс: ${formatSol(balance.sol, 6)} SOL`; }; fillBtn.addEventListener('click', async () => { if (!targetWallet) { status.textContent = 'Ошибка: в URL не передан параметр wallet.'; return; } if (!senderKeypair) { status.textContent = 'Ошибка: кошелёк отправителя не инициализирован.'; return; } fillBtn.disabled = true; status.textContent = 'Отправляем перевод...'; try { const endpoint = state.entrySettings.solanaServer; const tx = await transferSol({ endpoint, fromKeypair: senderKeypair, toAddress: targetWallet, amountSol: TRANSFER_AMOUNT_SOL, }); await updateSenderBalance(); status.textContent = `Готово. Signature: ${tx.signature}`; } catch (error) { status.textContent = `Ошибка перевода: ${error?.message || 'unknown'}`; } finally { fillBtn.disabled = false; } }); (async () => { try { const sender = await createSolanaWalletFromPrivateBase58(SENDER_PRIVATE_32_BASE58); senderAddress = sender.address; senderKeypair = sender.keypair; const senderAddressEl = senderBox.querySelector('#devnet-topup-sender-address'); if (senderAddressEl) senderAddressEl.textContent = `Адрес: ${senderAddress}`; await updateSenderBalance(); if (!targetWallet) { fillBtn.disabled = true; status.textContent = 'Передайте адрес получателя в параметре wallet.'; } } catch (error) { fillBtn.disabled = true; status.textContent = `Ошибка инициализации отправителя: ${error?.message || 'unknown'}`; } })(); screen.append( renderHeader({ title: 'DEVNET пополнение', leftAction: { label: '←', onClick: () => navigate('registration-payment-view') }, }), senderBox, targetBox, status, actions, ); return screen; }