SHA256
Промежуточный коммит: состояние до нормальной Solana-first регистрации
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
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 = `
|
||||
<strong>Тестовый DEVNET-кошелёк</strong>
|
||||
<p class="meta-muted" id="devnet-topup-sender-address">Адрес: ...</p>
|
||||
<p class="meta-muted" id="devnet-topup-sender-balance">Баланс: ...</p>
|
||||
`;
|
||||
|
||||
const targetBox = document.createElement('div');
|
||||
targetBox.className = 'card stack';
|
||||
targetBox.innerHTML = `
|
||||
<strong>Кошелёк получателя</strong>
|
||||
<p class="meta-muted" style="word-break:break-all;">${targetWallet || 'Не передан параметр wallet'}</p>
|
||||
<p class="meta-muted">Сумма перевода: ${TRANSFER_AMOUNT_SOL} SOL</p>
|
||||
`;
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user