diff --git a/index.html b/index.html
index 6e459fb..0877dc1 100644
--- a/index.html
+++ b/index.html
@@ -70,6 +70,20 @@
Состояние ещё не прочитано.
+
+
@@ -179,6 +193,38 @@ async function gwBalance(){
}catch(e){ log.err('balance: '+e.message); }
}
+// ---- Кошелёк и пополнение (тест) ----
+async function gwWallet(){
+ try{
+ const j = await gwFetch('/wallet', {});
+ document.getElementById('walletAddr').value = j.address || '';
+ log.ok('Кошелёк создан: '+j.address+' (денег на нём пока нет — нажмите «Пополнить кошелёк»)');
+ }catch(e){ log.err('wallet: '+e.message); }
+}
+
+async function gwTopUp(){
+ try{
+ const w = document.getElementById('walletAddr').value.trim();
+ const a = w || ADDR();
+ if(!a){ log.err('faucet: нет адреса — создайте кошелёк (или впишите адрес в поле «Адрес»)'); return; }
+ if(!w) document.getElementById('walletAddr').value = a;
+ const j = await gwFetch('/faucet/'+encodeURIComponent(a));
+ document.getElementById('balTok').textContent = j.tokenHuman;
+ document.getElementById('balSol').textContent = Number(j.sol).toFixed(6)+' SOL';
+ log.ok('Пополнено '+a+': фантики='+j.tokenHuman+', SOL='+j.sol);
+ }catch(e){
+ log.err('faucet: '+e.message);
+ if(String(e.message).indexOf('403')>=0) log.info('403 = пополнение выключено (режим release или сеть не тестовая). Это ожидаемо на боевом стенде.');
+ }
+}
+
+function useWalletAddr(){
+ const w = document.getElementById('walletAddr').value.trim();
+ if(!w){ log.err('в поле нет адреса кошелька — сначала «Создать кошелёк»'); return; }
+ document.getElementById('addr').value = w;
+ log.info('Адрес «'+w+'» подставлен в поле «Адрес» (для ставки и баланса)');
+}
+
let lastBetId = '';
async function gwBet(){
try{