function updateURLForPage(page, value) { let params = new URLSearchParams(); if (page === "transaction") { params.set("page", "transactions"); params.set("tx", value); } else if (page === "balance" || page === "history") { params.set("page", "transactions"); params.set("address", value); } window.history.replaceState( {}, "", `${location.pathname}?${params.toString()}` ); } function shareBalanceLink(address) { const addr = address || (document.getElementById("balanceAddr").value || "").trim(); if (!addr) return; const url = new URL(window.location.href); url.searchParams.set("page", "transactions"); url.searchParams.set("address", addr); navigator.clipboard.writeText(url.toString()).then(() => { if (typeof notify === "function") notify("Shareable balance link copied", "success"); }); } function shareTxLink(txid) { const id = txid || (document.getElementById("txHash").value || "").trim(); if (!id) return; const url = new URL(window.location.href); url.searchParams.set("page", "transactions"); url.searchParams.set("tx", id); navigator.clipboard.writeText(url.toString()).then(() => { if (typeof notify === "function") notify("Shareable tx link copied", "success"); }); } async function getTransactionDetails(txHash) { const url = "https://api.shasta.trongrid.io/wallet/gettransactionbyid"; const headers = { Accept: "application/json", "Content-Type": "application/json", }; const body = JSON.stringify({ value: txHash, visible: true, }); const response = await fetch(url, { method: "POST", headers, body, }); if (!response.ok) { throw new Error(`Error ${response.status}: ${response.statusText}`); } const data = await response.json(); console.log("Transaction details:", data); return data; } async function getTransactionInfoById(txHash) { const url = "https://api.shasta.trongrid.io/wallet/gettransactioninfobyid"; const headers = { Accept: "application/json", "Content-Type": "application/json", }; const body = JSON.stringify({ value: txHash, }); const response = await fetch(url, { method: "POST", headers, body, }); if (!response.ok) { throw new Error(`Error ${response.status}: ${response.statusText}`); } const data = await response.json(); console.log("Transaction info:", data); return data; } async function getBalanceByAddress(address) { try { const balance = await tronWeb.trx.getBalance(address); return balance / 1e6; } catch (err) { throw new Error("Failed to fetch balance: " + err.message); } } async function getBalanceByPrivKey(privKey) { try { let rawHexKey; // Detect WIF (BTC/FLO style) if (/^[5KLc9RQ][1-9A-HJ-NP-Za-km-z]{50,}$/.test(privKey)) { const decoded = coinjs.wif2privkey(privKey); if (!decoded || !decoded.privkey) { throw new Error("Invalid WIF private key"); } rawHexKey = decoded.privkey; console.log("Detected WIF private key:", rawHexKey); // Detect 64-char raw hex private key } else if (/^[0-9a-fA-F]{64}$/.test(privKey)) { rawHexKey = privKey; } else { throw new Error("Unsupported private key format"); } // Derive Tron address from private key const tronAddress = tronWeb.address.fromPrivateKey(rawHexKey); const balance = await getBalanceByAddress(tronAddress); return { tronAddress, balance }; } catch (err) { throw new Error("Invalid private key: " + err.message); } } async function runBalanceCheck() { const inputVal = document.getElementById("balanceAddr").value.trim(); const output = document.getElementById("balanceOutput"); // Set loading state if (typeof setButtonLoading === "function") { setButtonLoading("balanceBtn", true); } try { if (inputVal.startsWith("T")) { // Direct Tron address const tronAddress = inputVal; const balance = await getBalanceByAddress(inputVal); output.innerHTML = `
${tronAddress}
${tronAddress}
${err.message}
${err.message}