(function () { "use strict"; const providers = document.getElementById("providers"); const manualBox = document.getElementById("manualBox"); const manualAddress = document.getElementById("manualAddress"); const manualConfirm = document.getElementById("manualConfirm"); const manualCancel = document.getElementById("manualCancel"); const statusBox = document.getElementById("statusBox"); const statusText = document.getElementById("statusText"); const statusWallet = document.getElementById("statusWallet"); const statusAddress = document.getElementById("statusAddress"); const statusNetwork = document.getElementById("statusNetwork"); const successBox = document.getElementById("successBox"); const disconnectBtn = document.getElementById("disconnectBtn"); if (!providers) return; const PROVIDER_LABELS = { metamask: "MetaMask", walletconnect: "WalletConnect", coinbase: "Coinbase Wallet", manual: "Manual Address", }; const NETWORKS = ["Ethereum", "BNB Chain", "Polygon", "Arbitrum"]; const shorten = (addr) => addr.length > 12 ? addr.slice(0, 6) + "…" + addr.slice(-4): addr; const randomHex = (len) => { const chars = "0123456789abcdef"; let out = ""; for (let i = 0; i < len; i++) out += chars[Math.floor(Math.random() * 16)]; return out; }; const isValidAddress = (addr) => /^0x[a-fA-F0-9]{40}$/.test(addr.trim()); const setBusy = (busy) => { providers.querySelectorAll(".wallet-btn").forEach((b) => (b.disabled = busy)); }; const showStatus = (provider, address) => { statusBox.hidden = false; successBox.hidden = true; statusText.textContent = "Verifying ownership…"; statusWallet.textContent = PROVIDER_LABELS[provider] || provider; statusAddress.textContent = shorten(address); statusNetwork.textContent = NETWORKS[Math.floor(Math.random() * NETWORKS.length)]; }; const showSuccess = () => { statusText.textContent = "Verified ✓"; statusBox.hidden = false; successBox.hidden = false; successBox.scrollIntoView({ behavior: "smooth", block: "nearest" }); }; const connect = (provider, address) => { setBusy(true); manualBox.hidden = true; showStatus(provider, address); setTimeout(() => { setBusy(false); showSuccess(); }, 1400); }; const handleProvider = (provider) => { if (provider === "manual") { manualBox.hidden = false; manualAddress.focus(); return; } if (provider === "metamask" && typeof window.ethereum !== "undefined") { window.ethereum .request({ method: "eth_requestAccounts" }) .then((accounts) => { const addr = accounts && accounts[0] ? accounts[0]: "0x" + randomHex(40); connect(provider, addr); }) .catch(() => { connect(provider, "0x" + randomHex(40)); }); return; } connect(provider, "0x" + randomHex(40)); }; providers.querySelectorAll(".wallet-btn").forEach((btn) => { btn.addEventListener("click", () => handleProvider(btn.dataset.provider)); }); if (manualConfirm) { manualConfirm.addEventListener("click", () => { const value = manualAddress.value.trim(); if (!isValidAddress(value)) { manualAddress.classList.add("is-error"); manualAddress.focus(); return; } manualAddress.classList.remove("is-error"); connect("manual", value); }); } if (manualAddress) { manualAddress.addEventListener("input", () => manualAddress.classList.remove("is-error")); manualAddress.addEventListener("keydown", (e) => { if (e.key === "Enter") manualConfirm.click(); }); } if (manualCancel) { manualCancel.addEventListener("click", () => { manualBox.hidden = true; manualAddress.value = ""; manualAddress.classList.remove("is-error"); }); } if (disconnectBtn) { disconnectBtn.addEventListener("click", () => { statusBox.hidden = true; successBox.hidden = true; manualBox.hidden = true; manualAddress.value = ""; }); } })();