fix: checks positivos (CoinJoin) se marcan en verde, no como advertencia; docs: fixtures verificados

This commit is contained in:
Aitor
2026-06-03 19:29:06 +02:00
parent b77d21fd84
commit d8a35d94cf
2 changed files with 15 additions and 5 deletions
+11 -1
View File
@@ -20,7 +20,7 @@ nodo y corrige la fila).
| # | Tipo | txid | Resultado esperado | Verificado | | # | Tipo | txid | Resultado esperado | Verificado |
|---|------|------|--------------------|------------| |---|------|------|--------------------|------------|
| 1 | Whirlpool CoinJoin | `323df21f0b0756f98336437aa3d2fb87e02b59f1946b714a7b09df04d429dec2` | CoinJoin detectado, banda ALTA, fingerprint "Samourai/Sparrow" inferido | ☐ | | 1 | Whirlpool CoinJoin (5×5, 2019) | `323df21f0b0756f98336437aa3d2fb87e02b59f1946b714a7b09df04d429dec2` | CoinJoin detectado (✓ verde), banda ALTA, fingerprint "Samourai/Sparrow (Whirlpool)" | ✅ 2026-06-03 |
| 2 | WabiSabi CoinJoin | `fb596c9f675471019c60e984b569f9020dac3b2822b16396042b50c890b45e5e` | CoinJoin grande, banda ALTA, "Wasabi" inferido | ☐ | | 2 | WabiSabi CoinJoin | `fb596c9f675471019c60e984b569f9020dac3b2822b16396042b50c890b45e5e` | CoinJoin grande, banda ALTA, "Wasabi" inferido | ☐ |
| 3 | JoinMarket CoinJoin | `4f112abd2eefe3484a7bbf7c1731f784cba19de677468835145e9c448fb18b7d` | CoinJoin con outputs iguales, verificar mínimo ~10k sats | ☐ | | 3 | JoinMarket CoinJoin | `4f112abd2eefe3484a7bbf7c1731f784cba19de677468835145e9c448fb18b7d` | CoinJoin con outputs iguales, verificar mínimo ~10k sats | ☐ |
| 4 | Batch payment 144 outputs (F2Pool, 2022-02-15) | `ef5d100a70eea9b7349a40fdfd51064fc5cebf5e3b4240f92591569836896949` | 1→144 outputs, **NO** CoinJoin, banda **MEDIA**, check "Pago por lotes" penaliza (45) | ✅ 2026-06-03 | | 4 | Batch payment 144 outputs (F2Pool, 2022-02-15) | `ef5d100a70eea9b7349a40fdfd51064fc5cebf5e3b4240f92591569836896949` | 1→144 outputs, **NO** CoinJoin, banda **MEDIA**, check "Pago por lotes" penaliza (45) | ✅ 2026-06-03 |
@@ -113,3 +113,13 @@ título de cada check (CERTEZA/PROBABLE/POSIBLE) puede confundir cuando el check
da resultado negativo —por ejemplo "Estructura CoinJoin / mezcla — PROBABLE" da resultado negativo —por ejemplo "Estructura CoinJoin / mezcla — PROBABLE"
cuando en realidad NO hay CoinJoin (el resultado real está en el detalle, no en cuando en realidad NO hay CoinJoin (el resultado real está en el detalle, no en
el badge). Pendiente de mejorar la claridad de la presentación. el badge). Pendiente de mejorar la claridad de la presentación.
### 2026-06-03 — Fixture #1 (Whirlpool CoinJoin)
Al validar un Whirlpool real (5×5) se confirmó que el motor lo detecta bien
(banda ALTA, fingerprint correcto), pero el check de CoinJoin se mostraba con
icono gris neutro y badge ámbar, como si fuera una advertencia — cuando detectar
un CoinJoin es algo POSITIVO para la privacidad. Corregido: el icono y color de
cada check ahora reflejan si el resultado es bueno o malo para la privacidad
(verde = bueno), no solo el estado interno. Un CoinJoin detectado sale en verde.
El badge de certeza se mantiene aparte, indicando solo el nivel de confianza.
Esto resuelve en parte el punto anterior sobre la claridad del badge.
+4 -4
View File
@@ -1154,7 +1154,7 @@
? `Detectado: ${cjVariant}. ${tx.vin.length} inputs, ${tx.vout.length} outputs, ${maxEqual} outputs de igual valor. Mejora significativa de privacidad.` ? `Detectado: ${cjVariant}. ${tx.vin.length} inputs, ${tx.vout.length} outputs, ${maxEqual} outputs de igual valor. Mejora significativa de privacidad.`
: "No se detecta estructura CoinJoin. La transacción es trazable directamente.", : "No se detecta estructura CoinJoin. La transacción es trazable directamente.",
didactic: "CoinJoin combina inputs de múltiples usuarios en una sola transacción con outputs de igual valor, rompiendo el enlace entre emisor y receptor. Whirlpool usa denominaciones fijas (100k, 1M, 5M, 50M sats). JoinMarket y Wasabi tienen estructuras similares.", didactic: "CoinJoin combina inputs de múltiples usuarios en una sola transacción con outputs de igual valor, rompiendo el enlace entre emisor y receptor. Whirlpool usa denominaciones fijas (100k, 1M, 5M, 50M sats). JoinMarket y Wasabi tienen estructuras similares.",
penalty: 0, informational: true, positive: likelyCJ, penalty: 0, positive: likelyCJ, informational: !likelyCJ,
}); });
// Sin penalización por no usar CoinJoin — es una técnica avanzada, no un error // Sin penalización por no usar CoinJoin — es una técnica avanzada, no un error
@@ -1846,11 +1846,11 @@
<div key={check.id} style={{background:C.bgCard,border:`1px solid ${expanded===check.id?C.purple+"60":C.border}`,borderRadius:6,overflow:"hidden"}}> <div key={check.id} style={{background:C.bgCard,border:`1px solid ${expanded===check.id?C.purple+"60":C.border}`,borderRadius:6,overflow:"hidden"}}>
<div onClick={()=>setExpanded(expanded===check.id?null:check.id)} <div onClick={()=>setExpanded(expanded===check.id?null:check.id)}
style={{display:"flex",alignItems:"center",gap:8,padding:"10px 14px",cursor:"pointer"}}> style={{display:"flex",alignItems:"center",gap:8,padding:"10px 14px",cursor:"pointer"}}>
<span style={{fontSize:"0.8rem",color:check.informational?C.blue:check.pass?C.green:C.red,flexShrink:0,fontWeight:700}}> <span style={{fontSize:"0.8rem",color:check.informational?C.blue:(check.positive&&!check.pass)?C.green:check.pass?C.green:C.red,flexShrink:0,fontWeight:700}}>
{check.informational?"·":check.pass?"✓":"✗"} {check.informational?"·":(check.positive&&!check.pass)?"✓":check.pass?"✓":"✗"}
</span> </span>
<span style={{flex:1,fontSize:"0.73rem",color:C.t1,fontFamily:"monospace"}}>{check.label}</span> <span style={{flex:1,fontSize:"0.73rem",color:C.t1,fontFamily:"monospace"}}>{check.label}</span>
{!check.pass&&check.actionability&&( {!check.pass&&!check.positive&&check.actionability&&(
<span style={{fontSize:"0.55rem",fontFamily:"monospace",padding:"2px 6px",borderRadius:3,flexShrink:0, <span style={{fontSize:"0.55rem",fontFamily:"monospace",padding:"2px 6px",borderRadius:3,flexShrink:0,
background: check.actionability==="no_corregible"?C.redMuted:check.actionability==="wallet"?C.purpleMuted:C.amberMuted, background: check.actionability==="no_corregible"?C.redMuted:check.actionability==="wallet"?C.purpleMuted:C.amberMuted,
color: check.actionability==="no_corregible"?C.red:check.actionability==="wallet"?C.purple:C.amber, color: check.actionability==="no_corregible"?C.red:check.actionability==="wallet"?C.purple:C.amber,