From 0110e84c4951dc69f5da4d70dacd41b9e9a91094 Mon Sep 17 00:00:00 2001 From: Aitor Date: Mon, 1 Jun 2026 20:58:49 +0200 Subject: [PATCH] feat: exportar UTXO Map a CSV (local, sin salir del nodo) --- CHANGELOG.md | 14 ++++++++++++++ dashboard.html | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f4e207..6c99281 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,20 @@ y el versionado sigue [Versionado Semántico](https://semver.org/lang/es/): --- +## [1.1.0] — 2026-06-01 + +### Añadido + +- Exportación del UTXO Map a CSV. Un botón "↓ CSV" en el UTXO Map descarga + todos los UTXOs de la dirección analizada con su información: txid, vout, + valor en sats y en BTC, estado de confirmación, altura de bloque, score + de privacidad y problemas detectados. El archivo se genera en el navegador + y se descarga en local — no pasa por ningún servidor, no sale nada del nodo. + Pensado para abrir en una hoja de cálculo y ordenar o filtrar los UTXOs + por privacidad. + +--- + ## [1.0.0] — 2026-05-31 Primera versión completa y funcional. Suite de auditoría de privacidad diff --git a/dashboard.html b/dashboard.html index 339b17c..d0d3eb2 100644 --- a/dashboard.html +++ b/dashboard.html @@ -2141,11 +2141,58 @@ const avgPrivacy = privacyScores.length>0 ? Math.round(privacyScores.reduce((s,p)=>s+p.score,0)/privacyScores.length) : null; + // ── Exportar UTXOs a CSV ────────────────────────────────────────── + // Genera el archivo en el navegador y lo descarga en local. + // No pasa por ningún servidor, no sale nada del nodo. + const exportUtxosCSV = () => { + if(!utxos || utxos.length===0) return; + // Escapar campos: si llevan coma, comilla o salto, van entre comillas + const esc = (val) => { + const s = String(val ?? ""); + return /[",\n]/.test(s) ? '"' + s.replace(/"/g,'""') + '"' : s; + }; + const cabeceras = ["txid","vout","valor_sats","valor_btc","confirmado","altura_bloque","privacidad_score","problemas"]; + const filas = utxos.map((u,i) => { + const priv = privacyScores[i] || {score:"", issues:[]}; + return [ + u.txid, + u.vout, + u.value, + (u.value/1e8).toFixed(8), + u.status?.confirmed ? "si" : "no", + u.status?.confirmed ? (u.status.block_height ?? "") : "mempool", + priv.score, + (priv.issues || []).join("; "), + ].map(esc).join(","); + }); + const csv = [cabeceras.join(","), ...filas].join("\n"); + // BOM para que Excel abra los acentos bien + descarga vía Blob + const blob = new Blob(["\uFEFF" + csv], {type:"text/csv;charset=utf-8"}); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + const fecha = new Date().toISOString().slice(0,10); + const addrCorto = (addr || "utxos").slice(0,12); + a.href = url; + a.download = `txoko-utxos-${addrCorto}-${fecha}.csv`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + }; + return(
UTXO Map
+ {utxos&&utxos.length>0&&( + + )}
Analiza los UTXOs de una dirección con score de privacidad por UTXO y contexto de origen. Máx. {MAX_UTXOS} UTXOs.