> For the complete documentation index, see [llms.txt](https://novacont.gitbook.io/nova-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://novacont.gitbook.io/nova-docs/novacont-docs/espanol/auditoria-y-seguridad/revision-de-seguridad-de-novacont.md).

# Revisión de seguridad de NovaCont

**Alcance**

* NovaCont.sol
* NovaJury.sol

**Metodología**

* Análisis estático: Slither v0.11.5, 101 detectores, ejecutado en dos pasadas de compilación separadas.
* Cada hallazgo de nivel Medium o superior fue verificado manualmente contra el código fuente; los casos en que el análisis estático omitió contexto relevante están documentados y justificados en una sección separada a continuación.

| Severidad           | Cantidad | Nota                                                                                                                                                                    |
| ------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Critical / High     | 0        | -                                                                                                                                                                       |
| Medium (verificado) | 0        | Los 4 candidatos fueron revisados y cerrados como "Revisado y no explotable" a continuación, con justificación                                                          |
| Low                 | 8        | Optimización immutable (2), emisión de eventos faltante (2), missing-zero-check (código de biblioteca OZ), fijación de versión solc, costly-loop, cyclomatic-complexity |
| Informational       | 110      | Convención de nombres (\~90), assembly/low-level-calls (código de biblioteca OZ), uso de timestamp, unused-state                                                        |

**Hallazgos: revisados y determinados como no explotables**

Cuatro hallazgos marcados por Slither y cerrados tras revisión manual:

**Validación de ronda del oráculo (unused-return)**

Slither marcó que parte de los valores de retorno de "feed.latestRoundData()" no se utilizaban. La revisión del código confirmó que "getLatestTokenUSDPrice" ya implementa tanto la verificación de obsolescencia "updatedAt" como la verificación de ronda obsoleta "answeredInRound >= roundId". El hallazgo proviene de un falso positivo de Slither en un patrón de descarte parcial de tupla (el campo "startedAt", dejado como "None").

**Reentrada entre funciones (reentrancy-eth, reentrancy-no-eth)**

"createContract", "disputeWork", "joinJury" y "payCounterFee" llevan el modificador "nonReentrant". Dado que el "ReentrancyGuard" de OpenZeppelin usa un bloqueo único a nivel de contrato, la entrada a cualquier otra función "nonReentrant" está bloqueada mientras una se está ejecutando. La escritura en "dd.linkedCaseId" después de la llamada externa "createCase" en "disputeWork" es un patrón que Slither marca como violación de checks-effects-interactions, pero el bloqueo activo hace que la reentrada en este escenario sea efectivamente imposible.

**Locales no inicializados (\_assignJurors.selected, \_processJurorOutcomes.voters)**

"\_assignJurors" está protegida al final de su bucle por "require(pickedCount == JURORS\_PER\_CASE, "Not enough eligible jurors")". Si el grupo no contiene suficientes jurados elegibles, la función se revierte completamente; un array parcialmente llenado nunca puede ser retornado. "\_processJurorOutcomes" nunca accede a la porción no llenada del array "voters", ya que el límite del bucle está estrictamente definido por "voterCount"; los slots "address(0)" nunca son procesados.

**División antes de multiplicación (cancelContract, computeDisputeFeePerParty)**

En ambas ubicaciones, la división ocurre antes de la multiplicación. La magnitud del monto afectado es aproximadamente 1 wei (\~$0.000000000003) en el lado de Ethereum, y aproximadamente 1 unidad en el formato de precio de 8 decimales usado por el cálculo del oráculo ($0.000000005). En la práctica, esto necesitaría ocurrir millones de veces antes de que cualquier usuario o el protocolo experimentara una pérdida medible. No tiene efecto en la seguridad de los fondos ni en el bloqueo de fondos.

**Severidad baja**

| Hallazgo                                                | Recomendación                                                                                            |
| ------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| usdtToken/usdt podrían ser immutable                    | Si se establecen una vez en el constructor, marcar como immutable para ahorro de gas sin desventajas     |
| setJuryContract, setNovaContAddress no emiten eventos   | Se debería agregar un evento para transparencia                                                          |
| USDT\_DECIMALS no se usa                                | Código muerto, debería eliminarse                                                                        |
| replaceInactiveJuror tiene alta complejidad ciclomática | No es un bug funcional, pero se recomienda dividirlo en subfunciones para mantenibilidad y auditabilidad |
| solc ^0.8.20 incluye bugs conocidos del compilador      | No se usa assembly/verbatim en el proyecto mismo                                                         |

**Conclusión**

El análisis estático no reveló **hallazgos de severidad Critical o High** en la base de código. Los 4 candidatos de nivel Medium fueron cerrados como "No explotables" tras revisión manual, con justificaciones documentadas arriba. Los hallazgos restantes son optimizaciones de gas, estilo de código o decisiones de diseño ya conocidas y aceptadas. Este resultado no reemplaza una auditoría independiente de terceros, pero es una señal positiva sobre la madurez actual de la base de código.
