/* .SOL DOMAINS — Solana Name Service Lookup & Registration */ const SNS_API = 'https://sns-sdk-proxy.bonfida.workers.dev'; const BONFIDA_REG = 'https://naming.bonfida.org/#/domain/'; const SOLSCAN = 'https://solscan.io/account/'; let walletAddress = null; let currentTab = 'search'; // ─── DOM ──────────────────────────────────────────────────── const $ = s => document.querySelector(s); const $$ = s => document.querySelectorAll(s); document.addEventListener('DOMContentLoaded', () => { initTabs(); initSearch(); initWallet(); }); // ─── TABS ─────────────────────────────────────────────────── function initTabs() { $$('.sol-tab').forEach(tab => { tab.addEventListener('click', () => { const t = tab.dataset.tab; switchTab(t); }); }); } function switchTab(t) { currentTab = t; $$('.sol-tab').forEach(tab => tab.classList.toggle('active', tab.dataset.tab === t)); $$('.sol-panel').forEach(p => p.classList.toggle('hidden', p.id !== `panel-${t}`)); if (t === 'mydomains' && walletAddress) loadMyDomains(); } // ─── SEARCH / LOOKUP ──────────────────────────────────────── function initSearch() { const input = $('#sol-search'); const btn = $('#sol-search-go'); if (!input || !btn) return; btn.addEventListener('click', () => doSearch()); input.addEventListener('keydown', e => { if (e.key === 'Enter') doSearch(); }); // Reverse lookup const revInput = $('#sol-reverse'); const revBtn = $('#sol-reverse-go'); if (revInput && revBtn) { revBtn.addEventListener('click', () => doReverse()); revInput.addEventListener('keydown', e => { if (e.key === 'Enter') doReverse(); }); } } async function doSearch() { const raw = $('#sol-search').value.trim().toLowerCase(); if (!raw) return; // Strip .sol if user typed it const domain = raw.replace(/\.sol$/i, ''); const results = $('#search-results'); results.innerHTML = loadingHTML('RESOLVING DOMAIN...'); try { // Try to resolve — if it resolves, domain is taken const res = await fetch(`${SNS_API}/resolve/${domain}`); if (res.ok) { const data = await res.json(); const owner = data.result || data; // Domain is taken — show info await showTakenDomain(domain, typeof owner === 'string' ? owner : owner.result || JSON.stringify(owner)); } else if (res.status === 404) { // Domain is available showAvailableDomain(domain); } else { results.innerHTML = errorHTML('Failed to query domain. Try again.'); } } catch (err) { results.innerHTML = errorHTML(`Network error: ${err.message}`); } } async function showTakenDomain(domain, owner) { const results = $('#search-results'); // Try to get more data let records = {}; try { const recRes = await fetch(`${SNS_API}/record-v2/${domain}/SOL`); if (recRes.ok) { const recData = await recRes.json(); records.sol = recData.result || null; } } catch(e) {} // Try favourite domain of owner let favourite = null; try { const favRes = await fetch(`${SNS_API}/favourite-domain/${owner}`); if (favRes.ok) { const favData = await favRes.json(); favourite = favData.result || null; } } catch(e) {} results.innerHTML = `
${esc(domain)}.sol
REGISTERED
${favourite ? `
OWNER'S FAVOURITE
${esc(favourite)}.sol
` : ''}
`; } function showAvailableDomain(domain) { const results = $('#search-results'); const len = domain.length; let priceEstimate = ''; if (len <= 1) priceEstimate = '~750 USDC'; else if (len === 2) priceEstimate = '~700 USDC'; else if (len === 3) priceEstimate = '~640 USDC'; else if (len === 4) priceEstimate = '~160 USDC'; else priceEstimate = '~20 USDC'; results.innerHTML = `
${esc(domain)}.sol
AVAILABLE
LENGTH
${len} character${len !== 1 ? 's' : ''}
ESTIMATED COST
${priceEstimate.split(' ')[0].replace('~','')} ${priceEstimate.split(' ')[1] || 'USDC'} (estimated)
REGISTRATION
Register via Bonfida's official portal
REGISTER ${esc(domain.toUpperCase())}.SOL ↗
`; } // ─── REVERSE LOOKUP ───────────────────────────────────────── async function doReverse() { const addr = $('#sol-reverse').value.trim(); if (!addr) return; const results = $('#reverse-results'); results.innerHTML = loadingHTML('SCANNING WALLET...'); try { // Get all domains for this wallet const res = await fetch(`${SNS_API}/domains/${addr}`); if (!res.ok) { results.innerHTML = errorHTML('Could not resolve wallet. Check the address.'); return; } const data = await res.json(); const domains = data.result || data; if (!domains || !domains.length) { results.innerHTML = `
NO .SOL DOMAINS FOUND FOR THIS WALLET
`; return; } // Get favourite let favourite = null; try { const favRes = await fetch(`${SNS_API}/favourite-domain/${addr}`); if (favRes.ok) { const favData = await favRes.json(); favourite = favData.result || null; } } catch(e) {} results.innerHTML = `
DOMAINS: ${domains.length}
${favourite ? `
FAVOURITE: ${favourite}.sol
` : ''}
WALLET: ${truncAddr(addr)}
${domains.map(d => { const name = typeof d === 'string' ? d : (d.domain || d); const isFav = favourite && name === favourite; return `
${esc(name)}.sol
${isFav ? '
★ FAVOURITE
' : ''}
`; }).join('')}
`; } catch(err) { results.innerHTML = errorHTML(`Network error: ${err.message}`); } } // ─── WALLET ───────────────────────────────────────────────── function initWallet() { const btn = $('#wallet-btn'); if (!btn) return; btn.addEventListener('click', toggleWallet); } async function toggleWallet() { if (walletAddress) { disconnectWallet(); return; } // Check for Phantom if (!window.solana || !window.solana.isPhantom) { const bar = $('#wallet-status'); if (bar) bar.innerHTML = 'PHANTOM WALLET NOT DETECTED — INSTALL'; return; } try { const resp = await window.solana.connect(); walletAddress = resp.publicKey.toString(); updateWalletUI(); } catch(err) { console.error('Wallet connection failed:', err); } } function disconnectWallet() { if (window.solana) window.solana.disconnect(); walletAddress = null; updateWalletUI(); } function updateWalletUI() { const status = $('#wallet-status'); const btn = $('#wallet-btn'); if (walletAddress) { status.className = 'sol-wallet-status connected'; status.innerHTML = `● CONNECTED ${truncAddr(walletAddress)}`; btn.className = 'sol-wallet-btn disconnect'; btn.textContent = 'DISCONNECT'; } else { status.className = 'sol-wallet-status'; status.innerHTML = '○ NOT CONNECTED'; btn.className = 'sol-wallet-btn'; btn.textContent = 'CONNECT WALLET'; // Clear my domains const panel = $('#mydomains-content'); if (panel) panel.innerHTML = `
CONNECT WALLET TO VIEW YOUR DOMAINS
`; } } // ─── MY DOMAINS ───────────────────────────────────────────── async function loadMyDomains() { if (!walletAddress) return; const content = $('#mydomains-content'); content.innerHTML = loadingHTML('LOADING YOUR DOMAINS...'); try { const res = await fetch(`${SNS_API}/domains/${walletAddress}`); if (!res.ok) { content.innerHTML = errorHTML('Failed to load domains.'); return; } const data = await res.json(); const domains = data.result || data; // Get favourite let favourite = null; try { const favRes = await fetch(`${SNS_API}/favourite-domain/${walletAddress}`); if (favRes.ok) { const favData = await favRes.json(); favourite = favData.result || null; } } catch(e) {} if (!domains || !domains.length) { content.innerHTML = `
NO .SOL DOMAINS FOUND
Register one on Bonfida ↗
`; return; } content.innerHTML = `
YOUR DOMAINS: ${domains.length}
${favourite ? `
FAVOURITE: ${favourite}.sol
` : ''}
${domains.map(d => { const name = typeof d === 'string' ? d : (d.domain || d); const isFav = favourite && name === favourite; return `
${esc(name)}.sol
${isFav ? '
★ FAVOURITE
' : ''}
`; }).join('')}
`; } catch(err) { content.innerHTML = errorHTML(`Network error: ${err.message}`); } } // ─── HELPERS ──────────────────────────────────────────────── function truncAddr(a) { if (!a || a.length < 12) return a; return a.slice(0, 6) + '...' + a.slice(-4); } function esc(s) { const d = document.createElement('div'); d.textContent = s; return d.innerHTML; } function loadingHTML(msg) { return `
${msg}
`; } function errorHTML(msg) { return `
ERROR // ${msg}
`; }