SHiNE-server/shine-UI/server-ui/js/create-server-pda-page.js

125 lines
4.0 KiB
JavaScript

import { registerServerOnSolana } from '../../js/services/shine-user-pda-service.js';
import {
$,
buildKeyBundleFromForm,
clearGenMessage,
clearStatus,
openDevnetTopup,
deriveKeyBundleFromPassword,
fillKeyFields,
parseLoginList,
refreshDeviceBalance,
setGenMessage,
setStatus,
setupPasswordEye,
updateSolAddress,
validateLoginOrThrow,
wireDeviceAddressPreview,
} from './server-ui-shared.js';
const fieldMap = {
masterSecret: 'masterSecret',
rootPub: 'rootPub',
rootPriv: 'rootPriv',
bchPub: 'bchPub',
bchPriv: 'bchPriv',
devPub: 'devPub',
devPriv: 'devPriv',
solBox: 'solBox',
solAdr: 'solAdr',
};
setupPasswordEye($('btnEye'), $('password'));
wireDeviceAddressPreview(fieldMap);
$('password').value = '';
$('btnTopupDevnet').addEventListener('click', () => {
try {
openDevnetTopup($('devPub').value);
} catch (error) {
setStatus($('status'), error?.message || String(error), 'error');
}
});
$('btnRefreshBalance').addEventListener('click', async () => {
try {
$('btnRefreshBalance').disabled = true;
await refreshDeviceBalance({
endpoint: $('endpoint').value,
deviceAddress: $('devPub').value,
targetNode: $('deviceBalance'),
});
} catch (error) {
setStatus($('status'), error?.message || String(error), 'error');
} finally {
$('btnRefreshBalance').disabled = false;
}
});
$('btnGen').addEventListener('click', async () => {
clearGenMessage($('genMsg'));
clearStatus($('status'));
$('btnGen').disabled = true;
try {
const login = validateLoginOrThrow($('login').value);
const password = $('password').value;
const { masterSecret32, keyBundle } = await deriveKeyBundleFromPassword({
login,
password,
});
fillKeyFields(fieldMap, keyBundle, masterSecret32);
updateSolAddress(fieldMap);
$('deviceBalance').textContent = 'Теперь можно проверить баланс device-аккаунта.';
setGenMessage($('genMsg'), 'Ключи и master secret сгенерированы из логина и пароля. Транзакцию оплатит device-ключ.', 'ok');
} catch (error) {
setGenMessage($('genMsg'), error?.message || String(error), 'err');
} finally {
$('btnGen').disabled = false;
}
});
$('btnCreate').addEventListener('click', async () => {
clearStatus($('status'));
clearGenMessage($('genMsg'));
$('btnCreate').disabled = true;
try {
const login = validateLoginOrThrow($('login').value);
const endpoint = String($('endpoint').value || '').trim();
if (!endpoint) throw new Error('Укажите Solana endpoint');
const serverAddress = String($('serverAddress').value || '').trim();
if (!serverAddress) throw new Error('Укажите адрес сервера');
setStatus($('status'), 'Проверка и сборка keyBundle...', 'info');
const { keyBundle, normalized } = await buildKeyBundleFromForm(fieldMap);
$('rootPub').value = normalized.rootPubB58;
$('rootPriv').value = normalized.rootPrivB58;
$('bchPub').value = normalized.bchPubB58;
$('bchPriv').value = normalized.bchPrivB58;
$('devPub').value = normalized.devPubB58;
$('devPriv').value = normalized.devPrivB58;
updateSolAddress(fieldMap);
setStatus($('status'), 'Отправка create_user_pda в Solana...', 'info');
const result = await registerServerOnSolana({
login,
keyBundle,
serverAddress,
syncServers: parseLoginList($('syncServers').value),
accessServers: parseLoginList($('accessServers').value),
solanaEndpoint: endpoint,
});
setStatus(
$('status'),
`✓ Сервер зарегистрирован!\n\nЛогин: ${login}\nPDA: ${result.pdaAddress}\nBlockchain: ${result.blockchainName}\nТранзакция: ${result.signature}`,
'success',
);
} catch (error) {
setStatus($('status'), error?.message || String(error), 'error');
} finally {
$('btnCreate').disabled = false;
}
});
document.body.dataset.ready = '1';