> 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/seguridad-y-desarrolladores/arquitectura-de-contratos.md).

# Arquitectura de contratos

El protocolo de NovaCont se divide en dos contratos inteligentes separados. Esta separación de responsabilidades es intencional — aísla la gestión de fondos de la resolución de disputas, garantizando que un fallo o actualización en una capa no comprometa a la otra.

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

### NovaCont — La capa de depósito en garantía

NovaCont es el contrato principal. Es responsable de:

* Aceptar y bloquear los fondos del cliente en la creación del contrato
* Hacer cumplir el ciclo de vida del acuerdo a través de estrictas transiciones de estado
* Gestionar la distribución de fondos al completarse, cancelarse o resolverse una disputa
* Interactuar con NovaJury cuando una disputa se escala al sistema de jurado descentralizado

NovaCont hereda de tres contratos base de OpenZeppelin:

**ReentrancyGuard** — Previene ataques de reentrada en todas las funciones que mueven fondos. Cada llamada externa que toca saldos de ETH o ERC-20 está envuelta con el modificador `nonReentrant`.

**Ownable2Step** — Implementa un mecanismo de transferencia de propiedad en dos pasos. El nuevo propietario debe aceptar explícitamente la propiedad antes de que se finalice la transferencia, evitando transferencias de propiedad accidentales o maliciosas a direcciones inválidas.

**Pausable** — Permite al propietario del contrato pausar todas las operaciones que modifican el estado en caso de una vulnerabilidad crítica o emergencia. La pausa no afecta los retiros de fondos — los usuarios siempre pueden recuperar sus fondos incluso cuando el contrato está pausado.

### NovaJury — La capa de arbitraje

NovaJury es el contrato de resolución de disputas. Opera independientemente de NovaCont y es responsable de:

* Gestionar el grupo de jurados, incluyendo staking, advertencias, recortes y expulsión
* Recibir casos de disputa enviados por NovaCont
* Cobrar y distribuir tarifas de disputa entre las partes y los jurados
* Asignar jurados aleatoriamente a los casos y gestionar el ciclo de vida de votación
* Devolver veredictos finales a NovaCont para su ejecución en cadena

NovaJury hereda los mismos tres contratos base de OpenZeppelin — ReentrancyGuard, Ownable2Step y Pausable — por las mismas razones de seguridad.

### Cómo se comunican los dos contratos

NovaCont y NovaJury se comunican a través de un conjunto de interfaces estrictamente controladas. Ningún contrato puede llamar a funciones arbitrarias en el otro — solo se exponen puntos de entrada específicos y explícitamente definidos.

**NovaCont → NovaJury:** Cuando se abre una disputa en modo jurado, NovaCont llama a `INovaJury.createCase()` en el contrato de NovaJury, pasando todos los datos relevantes del caso incluyendo el ID del contrato, las direcciones de las partes, el precio acordado, el URI de evidencia y el URI de razón de disputa. NovaCont también llama a `INovaJury.computeDisputeFeePerParty()` para determinar la tarifa correcta antes de iniciar la transferencia.

**NovaJury → NovaCont:** Cuando se finaliza un veredicto, NovaJury llama a `settleDisputeByJury()` en NovaCont, pasando el ID del contrato, el ID del caso y la asignación de puntos base del proveedor. NovaJury también llama a `onCounterFeePaid()` para notificar a NovaCont cuando la contraparte ha pagado su parte de la tarifa de disputa.

**Control de acceso:** Todas las llamadas de NovaJury a NovaCont están protegidas por el modificador `onlyJuryContract` — solo la dirección registrada de NovaJury puede invocar estas funciones. Simétricamente, solo las llamadas de NovaCont a NovaJury pueden crear casos — los actores externos no pueden inyectar casos directamente en NovaJury.
