> 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/seguranca-e-desenvolvedores/arquitetura-de-contratos.md).

# Arquitetura de contratos

O protocolo NovaCont é dividido em dois contratos inteligentes separados. Essa separação de responsabilidades é intencional — isola o gerenciamento de fundos da resolução de disputas, garantindo que uma falha ou atualização em uma camada não comprometa a outra.

<figure><img src="/files/xSnSpj4aaZpDJ9UCPI6L" alt=""><figcaption></figcaption></figure>

### NovaCont — A camada de depósito em garantia

NovaCont é o contrato principal. É responsável por:

* Aceitar e bloquear os fundos do cliente na criação do contrato
* Aplicar o ciclo de vida do acordo através de transições de estado rigorosas
* Gerenciar a distribuição de fundos na conclusão, cancelamento ou resolução de disputa
* Interagir com o NovaJury quando uma disputa é escalada para o sistema de júri descentralizado

NovaCont herda de três contratos base da OpenZeppelin:

**ReentrancyGuard** — Previne ataques de reentrada em todas as funções que movem fundos. Cada chamada externa que toca saldos de ETH ou ERC-20 é envolvida com o modificador `nonReentrant`.

**Ownable2Step** — Implementa um mecanismo de transferência de propriedade em duas etapas. O novo proprietário deve aceitar explicitamente a propriedade antes que a transferência seja finalizada, evitando transferências de propriedade acidentais ou maliciosas para endereços inválidos.

**Pausable** — Permite que o proprietário do contrato pause todas as operações que modificam o estado em caso de uma vulnerabilidade crítica ou emergência. A pausa não afeta as retiradas de fundos — os usuários sempre podem recuperar seus fundos mesmo quando o contrato está pausado.

### NovaJury — A camada de arbitragem

NovaJury é o contrato de resolução de disputas. Opera independentemente do NovaCont e é responsável por:

* Gerenciar o grupo de jurados, incluindo staking, avisos, cortes e expulsão
* Receber casos de disputa encaminhados pelo NovaCont
* Cobrar e distribuir taxas de disputa entre as partes e os jurados
* Atribuir jurados aleatoriamente aos casos e gerenciar o ciclo de vida de votação
* Retornar veredictos finais ao NovaCont para execução on-chain

O NovaJury herda os mesmos três contratos base da OpenZeppelin — ReentrancyGuard, Ownable2Step e Pausable — pelas mesmas razões de segurança.

### Como os dois contratos se comunicam

NovaCont e NovaJury se comunicam através de um conjunto de interfaces estritamente controladas. Nenhum contrato pode chamar funções arbitrárias no outro — apenas pontos de entrada específicos e explicitamente definidos são expostos.

**NovaCont → NovaJury:** Quando uma disputa é aberta no modo júri, o NovaCont chama `INovaJury.createCase()` no contrato NovaJury, passando todos os dados relevantes do caso incluindo o ID do contrato, os endereços das partes, o preço acordado, o URI de evidência e o URI de motivo de disputa. O NovaCont também chama `INovaJury.computeDisputeFeePerParty()` para determinar a taxa correta antes de iniciar a transferência.

**NovaJury → NovaCont:** Quando um veredicto é finalizado, o NovaJury chama `settleDisputeByJury()` no NovaCont, passando o ID do contrato, o ID do caso e a alocação de pontos base do fornecedor. O NovaJury também chama `onCounterFeePaid()` para notificar o NovaCont quando a contraparte pagou sua parte da taxa de disputa.

**Controle de acesso:** Todas as chamadas do NovaJury para o NovaCont são protegidas pelo modificador `onlyJuryContract` — apenas o endereço registrado do NovaJury pode invocar essas funções. Simetricamente, apenas as chamadas do NovaCont para o NovaJury podem criar casos — atores externos não podem injetar casos diretamente no NovaJury.
