> 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/portugues/auditoria-e-seguranca/revisao-de-seguranca-do-novacont.md).

# Revisão de segurança do NovaCont

**Escopo**

* NovaCont.sol
* NovaJury.sol

**Metodologia**

* Análise estática: Slither v0.11.5, 101 detectores, executado em duas passagens de compilação separadas.
* Cada descoberta de nível Medium ou superior foi verificada manualmente contra o código-fonte; casos em que a análise estática perdeu contexto relevante estão documentados e justificados em uma seção separada abaixo.

| Severidade          | Quantidade | Nota                                                                                                                                                                |
| ------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Critical / High     | 0          | -                                                                                                                                                                   |
| Medium (verificado) | 0          | Todos os 4 candidatos foram revisados e fechados como "Revisado e não explorável" abaixo, com justificativa                                                         |
| Low                 | 8          | Otimização immutable (2), emissão de eventos faltante (2), missing-zero-check (código de biblioteca OZ), fixação de versão solc, costly-loop, cyclomatic-complexity |
| Informational       | 110        | Convenção de nomes (\~90), assembly/low-level-calls (código de biblioteca OZ), uso de timestamp, unused-state                                                       |

**Descobertas: revisadas e determinadas como não exploráveis**

Quatro descobertas marcadas pelo Slither e fechadas após revisão manual:

**Validação de rodada do oráculo (unused-return)**

O Slither marcou que parte dos valores de retorno de "feed.latestRoundData()" não eram usados. A revisão do código confirmou que "getLatestTokenUSDPrice" já implementa tanto a verificação de obsolescência "updatedAt" quanto a verificação de rodada obsoleta "answeredInRound >= roundId". A descoberta provém de um falso positivo do Slither em um padrão de descarte parcial de tupla (o campo "startedAt", deixado como "None").

**Reentrância entre funções (reentrancy-eth, reentrancy-no-eth)**

"createContract", "disputeWork", "joinJury" e "payCounterFee" possuem o modificador "nonReentrant". Como o "ReentrancyGuard" da OpenZeppelin usa um bloqueio único no nível do contrato, a entrada em qualquer outra função "nonReentrant" é bloqueada enquanto uma está em execução. A escrita em "dd.linkedCaseId" após a chamada externa "createCase" em "disputeWork" é um padrão que o Slither marca como violação de checks-effects-interactions, mas o bloqueio ativo torna a reentrância neste cenário efetivamente impossível.

**Locais não inicializados (\_assignJurors.selected, \_processJurorOutcomes.voters)**

"\_assignJurors" é protegida no final do seu loop por "require(pickedCount == JURORS\_PER\_CASE, "Not enough eligible jurors")". Se o pool não contiver jurados elegíveis suficientes, a função reverte completamente; um array parcialmente preenchido nunca pode ser retornado. "\_processJurorOutcomes" nunca acessa a porção não preenchida do array "voters", pois o limite do loop é estritamente definido por "voterCount"; slots "address(0)" nunca são processados.

**Divisão antes da multiplicação (cancelContract, computeDisputeFeePerParty)**

Em ambos os locais, a divisão acontece antes da multiplicação. A magnitude do valor afetado é aproximadamente 1 wei (\~$0.000000000003) no lado do Ethereum, e aproximadamente 1 unidade no formato de preço de 8 decimais usado pelo cálculo do oráculo ($0.000000005). Na prática, isso precisaria ocorrer milhões de vezes antes que qualquer usuário ou o protocolo experimentasse uma perda mensurável. Não tem efeito na segurança dos fundos nem no bloqueio de fundos.

**Severidade baixa**

| Descoberta                                             | Recomendação                                                                                           |
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
| usdtToken/usdt poderiam ser immutable                  | Se definidos uma vez no construtor, marcar como immutable para economia de gas sem desvantagens        |
| setJuryContract, setNovaContAddress não emitem eventos | Um evento deveria ser adicionado para transparência                                                    |
| USDT\_DECIMALS não é usado                             | Código morto, deveria ser removido                                                                     |
| replaceInactiveJuror tem alta complexidade ciclomática | Não é um bug funcional, mas dividir em subfunções é recomendado para manutenibilidade e auditabilidade |
| solc ^0.8.20 inclui bugs conhecidos do compilador      | Nenhum uso de assembly/verbatim no projeto em si                                                       |

**Conclusão**

A análise estática não revelou **descobertas de severidade Critical ou High** na base de código. Todos os 4 candidatos de nível Medium foram fechados como "Não exploráveis" após revisão manual, com justificativas documentadas acima. As descobertas restantes são otimizações de gas, estilo de código ou decisões de design já conhecidas e aceitas. Este resultado não substitui uma auditoria independente de terceiros, mas é um sinal positivo sobre a maturidade atual da base de código.
