Регистрация: проверка реального баланса wallet.key перед продолжением

This commit is contained in:
AidarKC 2026-04-27 01:50:41 +03:00
parent 50da3e868d
commit 14cc3be620
2 changed files with 31 additions and 24 deletions

View File

@ -1,2 +1,2 @@
client.version=1.2.18 client.version=1.2.19
server.version=1.2.18 server.version=1.2.19

View File

@ -44,9 +44,7 @@ export function render({ navigate }) {
walletValue.className = 'input'; walletValue.className = 'input';
walletValue.type = 'text'; walletValue.type = 'text';
walletValue.value = state.registrationPayment.walletAddress || ''; walletValue.value = state.registrationPayment.walletAddress || '';
walletValue.addEventListener('input', () => { walletValue.readOnly = true;
state.registrationPayment.walletAddress = walletValue.value;
});
const walletRow = document.createElement('div'); const walletRow = document.createElement('div');
walletRow.className = 'inline-input-row'; walletRow.className = 'inline-input-row';
@ -83,8 +81,8 @@ export function render({ navigate }) {
refreshButton.textContent = '↻'; refreshButton.textContent = '↻';
refreshButton.title = 'Обновить'; refreshButton.title = 'Обновить';
const refreshBalance = async ({ showError = true } = {}) => { const refreshBalance = async ({ showError = true, addressOverride = '' } = {}) => {
const address = String(walletValue.value || '').trim(); const address = String(addressOverride || walletValue.value || '').trim();
if (!address) return null; if (!address) return null;
refreshButton.disabled = true; refreshButton.disabled = true;
try { try {
@ -107,6 +105,19 @@ export function render({ navigate }) {
} }
}; };
const deriveUserWalletAddress = async () => {
const draftPassword = String(state.registrationDraft.password ?? '');
if (!draftPassword) {
throw new Error('Не найден пароль регистрации для вычисления wallet.key');
}
const wallet = await deriveWalletFromPassword(draftPassword);
const address = String(wallet?.address || '').trim();
if (!address) throw new Error('Не удалось вычислить адрес wallet.key');
state.registrationPayment.walletAddress = address;
walletValue.value = address;
return address;
};
refreshButton.addEventListener('click', () => { refreshButton.addEventListener('click', () => {
void refreshBalance(); void refreshBalance();
}); });
@ -117,9 +128,15 @@ export function render({ navigate }) {
topupButton.className = 'ghost-btn'; topupButton.className = 'ghost-btn';
topupButton.type = 'button'; topupButton.type = 'button';
topupButton.textContent = 'Пополнить кошелёк'; topupButton.textContent = 'Пополнить кошелёк';
topupButton.addEventListener('click', () => { topupButton.addEventListener('click', async () => {
const walletAddress = String(walletValue.value || '').trim(); try {
window.open(getTopupSiteUrl(walletAddress), '_blank', 'noopener,noreferrer'); const walletAddress = await deriveUserWalletAddress();
window.open(getTopupSiteUrl(walletAddress), '_blank', 'noopener,noreferrer');
} catch (error) {
status.className = 'status-line is-unavailable';
status.textContent = `Не удалось подготовить кошелёк: ${error?.message || 'unknown'}`;
status.style.display = '';
}
}); });
const submitButton = document.createElement('button'); const submitButton = document.createElement('button');
@ -141,15 +158,8 @@ export function render({ navigate }) {
submitButton.disabled = true; submitButton.disabled = true;
submitButton.textContent = 'Регистрация...'; submitButton.textContent = 'Регистрация...';
const walletAddress = String(walletValue.value || '').trim(); const walletAddress = await deriveUserWalletAddress();
if (!walletAddress) { const currentBalance = await refreshBalance({ showError: true, addressOverride: walletAddress });
status.className = 'status-line is-unavailable';
status.textContent = 'Кошелёк не подготовлен. Нажмите «Обновить» и попробуйте снова.';
status.style.display = '';
return;
}
const currentBalance = await refreshBalance({ showError: true });
if (currentBalance == null) return; if (currentBalance == null) return;
if (currentBalance < MIN_REQUIRED_SOL) { if (currentBalance < MIN_REQUIRED_SOL) {
status.className = 'status-line is-unavailable'; status.className = 'status-line is-unavailable';
@ -205,11 +215,8 @@ export function render({ navigate }) {
(async () => { (async () => {
try { try {
const draftPassword = String(state.registrationDraft.password ?? ''); const walletAddress = await deriveUserWalletAddress();
const wallet = await deriveWalletFromPassword(draftPassword); await refreshBalance({ addressOverride: walletAddress });
state.registrationPayment.walletAddress = wallet.address;
walletValue.value = wallet.address;
await refreshBalance();
} catch (error) { } catch (error) {
status.className = 'status-line is-unavailable'; status.className = 'status-line is-unavailable';
status.textContent = `Не удалось подготовить wallet.key: ${error?.message || 'unknown'}`; status.textContent = `Не удалось подготовить wallet.key: ${error?.message || 'unknown'}`;