# Depósito de sBTC

## Resumen

El [Contrato de depósito de sBTC](https://github.com/stacks-network/sbtc/blob/main/contracts/contracts/sbtc-deposit.clar) (`sbtc-deposit.clar`) gestiona el proceso de depósito para el sistema sBTC. Maneja la validación y la acuñación de tokens sBTC cuando los usuarios depositan Bitcoin, e interactúa con el contrato del Registro de sBTC para actualizar el estado del protocolo.

## Constantes

* `txid-length`: La longitud requerida de un ID de transacción (32 bytes).
* `dust-limit`: La cantidad mínima para un depósito válido (546 satoshis).

## Constantes de error

* `ERR_TXID_LEN` (u300): Indica que el ID de transacción proporcionado no tiene la longitud correcta.
* `ERR_DEPOSIT_REPLAY` (u301): Significa un intento de repetir un depósito que ya se ha completado.
* `ERR_LOWER_THAN_DUST` (u302): Indica que el monto del depósito está por debajo del límite de polvo.
* `ERR_DEPOSIT_INDEX_PREFIX`: Se usa como prefijo para errores relacionados con depósitos en el procesamiento por lotes.
* `ERR_DEPOSIT` (u303): Error general de depósito.
* `ERR_INVALID_CALLER` (u304): Indica que el llamador no está autorizado para realizar la operación.

***

## Funciones públicas

### complete-deposit-wrapper

Procesa una sola solicitud de depósito.

* Parámetros:
  * `txid`: `(buff 32)` - El ID de transacción de Bitcoin
  * `vout-index`: `uint` - El índice de salida de la transacción de depósito
  * `amount`: `uint` - La cantidad de sBTC a acuñar (en satoshis)
  * `recipient`: `principal` - La dirección de Stacks que recibirá el sBTC acuñado
* Devuelve: `(response bool uint)`

{% stepper %}
{% step %}
**Validación y autorización**

1. Verifica que el llamador sea el principal firmante actual.
2. Comprueba que el monto del depósito esté por encima del límite de polvo.
3. Valida la longitud del ID de transacción.
   {% endstep %}

{% step %}
**Protección contra repetición**

4. Se asegura de que el depósito no haya sido procesado antes (evita la repetición).
   {% endstep %}

{% step %}
**Ejecución**

5. Acuna tokens sBTC para el destinatario mediante `.sbtc-token`de `protocol-mint`.
6. Actualiza el estado del depósito en el contrato del Registro de sBTC mediante `.sbtc-registry`de `complete-deposit`.
   {% endstep %}
   {% endstepper %}

***

### complete-deposits-wrapper

Procesa múltiples solicitudes de depósito en una sola transacción.

* Parámetros:
  * `depósitos`: `(list 650 {txid: (buff 32), vout-index: uint, amount: uint, recipient: principal})` - Lista de datos de depósito
* Devuelve: `(response uint uint)`

{% stepper %}
{% step %}
**Autorización**

1. Verifica que el llamador sea el principal firmante actual.
   {% endstep %}

{% step %}
**Procesamiento por lotes**

2. Itera a través de la lista de depósitos, procesando cada uno usando el `complete-individual-deposits-helper` función.
   {% endstep %}
   {% endstepper %}

***

## Funciones privadas

### complete-individual-deposits-helper

Función auxiliar para procesar depósitos individuales dentro de la operación por lotes.

* Parámetros:
  * `depósito`: `{txid: (buff 32), vout-index: uint, amount: uint, recipient: principal}` - Datos de un solo depósito
  * `helper-response`: `(response uint uint)` - Acumulador para hacer seguimiento de los depósitos procesados
* Devuelve: `(response uint uint)`

{% stepper %}
{% step %}
**Llamar al envoltorio de depósito**

1. Llama a `complete-deposit-wrapper` para el depósito individual.
   {% endstep %}

{% step %}
**Manejo de éxito**

2. Si tiene éxito, incrementa el conteo de depósitos procesados.
   {% endstep %}

{% step %}
**Manejo de errores**

3. Si ocurre un error, se propaga con información adicional de índice (usando `ERR_DEPOSIT_INDEX_PREFIX` o constantes de error relacionadas).
   {% endstep %}
   {% endstepper %}

***

## Interacciones con otros contratos

* `.sbtc-registry`: Llama a `get-current-signer-data`, `get-completed-deposit`, y `complete-deposit` para gestionar el estado de los depósitos.
* `.sbtc-token`: Llama a `protocol-mint` para crear nuevos tokens sBTC.

***

## Consideraciones de seguridad

1. Control de acceso: Solo el principal firmante actual puede llamar a las funciones de finalización de depósito.
2. Prevención de repetición: El contrato verifica depósitos procesados anteriormente para evitar ataques de repetición.
3. Límite de polvo: Impone un monto mínimo de depósito para evitar spam y garantizar la viabilidad económica.
4. Validación del ID de transacción: Asegura que el ID de transacción proporcionado tenga la longitud correcta.
