contractauditorx-sdk
Version:
Auditoría automática de contratos inteligentes con generación de enlaces de pago vía Coinbase Commerce.
97 lines (77 loc) • 4.07 kB
HTML
<body style="margin:0; font-family:'Inter', sans-serif; background:linear-gradient(120deg, #7f00ff, #00c6ff); color:#333;">
<div class="container" style="max-width:600px; margin:auto; text-align:center; padding-top:60px;">
<h1 style="font-size:2.5rem; margin-bottom:10px; color:white;">🔍 ConocAuditBot</h1>
<p style="font-size:1.2rem; margin-bottom:30px; color:#f5f5f5;">Auditoría instantánea para contratos inteligentes en segundos</p>
<input id="contractInput" type="text" placeholder="Pega tu contrato aquí"
style="padding:10px; width:80%; border-radius:5px; border:1px solid #ccc; font-size:16px; margin-bottom:20px;" />
<button id="auditButton"
style="padding:12px 24px; font-size:16px; background-color:#fff; color:#7f00ff; border:none; border-radius:30px; box-shadow:0 0 10px #fff; cursor:pointer; transition:all 0.3s ease;">
⚡ Auditar ahora
</button>
<div id="report" class="output"
style="margin-top:30px; text-align:left; padding:15px; background-color:rgba(255,255,255,0.9); border-radius:10px;">
<p id="statusText" style="font-weight:bold; margin-bottom:10px;">⏳ Esperando dirección...</p>
<pre id="auditOutput" style="white-space:pre-wrap; font-size:14px; color:#333;"></pre>
<a id="coinbaseLink" href="#" target="_blank"
style="display:none; margin-top:15px; text-decoration:none; font-weight:bold; color:#2ecc71;">💳 Pagar con Coinbase</a>
</div>
</div>
<script>
document.getElementById("auditButton").addEventListener("click", async () => {
const code = document.getElementById("contractInput").value.trim();
const output = document.getElementById("auditOutput");
const statusText = document.getElementById("statusText");
const coinbaseLink = document.getElementById("coinbaseLink");
if (!code) {
statusText.innerText = "⚠️ Contrato inválido.";
output.innerText = "";
coinbaseLink.style.display = "none";
return;
}
statusText.innerText = "🔄 Generando pago...";
output.innerText = "";
coinbaseLink.style.display = "none";
try {
const res = await fetch("https://contractauditorx.onrender.com/audit", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ code })
});
const data = await res.json();
if (data.status === "pendiente") {
coinbaseLink.href = data.payment_url;
coinbaseLink.style.display = "inline-block";
coinbaseLink.innerText = "💳 Pagar con Coinbase";
statusText.innerText = "💰 Esperando confirmación de pago...";
// Esperar 10 segundos y verificar pago
setTimeout(async () => {
const verifyRes = await fetch("https://contractauditorx.onrender.com/verify-payment", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ charge_id: data.charge_id, code })
});
const verifyData = await verifyRes.json();
if (verifyData.status === "paid") {
statusText.innerText = "✅ Auditoría completada:";
output.innerText = JSON.stringify(verifyData.audit_report, null, 2);
} else {
statusText.innerText = "⏳ Pago no confirmado aún.";
output.innerText = "Intenta nuevamente en unos segundos.";
}
}, 10000);
} else {
statusText.innerText = "❌ Error del servidor:";
output.innerText = data.error || "No se recibió respuesta válida.";
}
} catch (err) {
statusText.innerText = "🔥 Error de red o CORS.";
output.innerText = err.message;
coinbaseLink.style.display = "none";
console.error(err);
}
});
</script>
</body>
<script src="script.js"></script>
</body>
</html>