# Retiro de sBTC

## Resumen

El [Contrato de retiro de sBTC](https://github.com/stacks-network/sbtc/blob/main/contracts/contracts/sbtc-withdrawal.clar) (`sbtc-withdrawal.clar`) gestiona el proceso de retiro para el sistema sBTC. Maneja la iniciación, aceptación y rechazo de solicitudes de retiro, garantizando la validación adecuada y la interacción con otros contratos de sBTC.

## Constantes

### Códigos de error

* `ERR_INVALID_ADDR_VERSION` (u500): Versión de dirección no válida.
* `ERR_INVALID_ADDR_HASHBYTES` (u501): hashbytes de dirección no válidos.
* `ERR_DUST_LIMIT` (u502): El monto del retiro está por debajo del límite de dust.
* `ERR_INVALID_REQUEST` (u503): ID de solicitud de retiro no válido.
* `ERR_INVALID_CALLER` (u504): El llamador no es el principal firmante actual.
* `ERR_ALREADY_PROCESSED` (u505): La solicitud de retiro ya fue procesada.
* `ERR_FEE_TOO_HIGH` (u505): La comisión pagada es mayor que la solicitada.
* `ERR_WITHDRAWAL_INDEX_PREFIX`: Prefijo para errores del índice de retiro.
* `ERR_WITHDRAWAL_INDEX` (u506): Error general del índice de retiro.

### Otras constantes

* `MAX_ADDRESS_VERSION` (u6): Valor máximo de una versión de dirección.
* `MAX_ADDRESS_VERSION_BUFF_20` (u4): Versión máxima para hashbytes de 20 bytes.
* `MAX_ADDRESS_VERSION_BUFF_32` (u6): Versión máxima para hashbytes de 32 bytes.
* `DUST_LIMIT` (u546): Cantidad mínima de sBTC para retiro.

## Funciones públicas

### initiate-withdrawal-request

Inicia una nueva solicitud de retiro.

* Parámetros:
  * `amount`: `uint` - Cantidad de sBTC a retirar
  * `recipient`: `{ version: (buff 1), hashbytes: (buff 32) }` - Detalles de la dirección de Bitcoin
  * `max-fee`: `uint` - Comisión máxima para el retiro
* Devuelve: `(response uint uint)`

### accept-withdrawal-request

Acepta una solicitud de retiro.

* Parámetros:
  * `request-id`: `uint` - ID de la solicitud de retiro
  * `bitcoin-txid`: `(buff 32)` - ID de la transacción de Bitcoin
  * `signer-bitmap`: `uint` - Mapa de bits de los firmantes
  * `output-index`: `uint` - Índice de salida en la transacción de Bitcoin
  * `fee`: `uint` - Comisión real pagada
* Devuelve: `(response bool uint)`

### reject-withdrawal-request

Rechaza una solicitud de retiro.

* Parámetros:
  * `request-id`: `uint` - ID de la solicitud de retiro
  * `signer-bitmap`: `uint` - Mapa de bits de los firmantes
* Devuelve: `(response bool uint)`

### complete-withdrawals

Procesa múltiples solicitudes de retiro (aceptar o rechazar).

* Parámetros:
  * `withdrawals`: `(lista 600 {...})` - Lista de detalles de retiros
* Devuelve: `(response uint uint)`

## Funciones de solo lectura

### validate-recipient

Valida el formato de la dirección de Bitcoin del destinatario.

* Parámetros:
  * `recipient`: `{ version: (buff 1), hashbytes: (buff 32) }` - Detalles de la dirección de Bitcoin
* Devuelve: `(response bool uint)`

## Funciones privadas

### complete-individual-withdrawal-helper

Función auxiliar para procesar retiros individuales en la operación por lotes.

* Parámetros:
  * `withdrawal`: `{...}` - Detalles del retiro individual
  * `helper-response`: `(response uint uint)` - Acumulador para el procesamiento
* Devuelve: `(response uint uint)`

## Interacciones con otros contratos

* `.sbtc-token`: Llama a `protocol-lock`, `protocol-burn-locked`, `protocol-mint`, y `protocol-unlock` para operaciones con tokens.
* `.sbtc-registry`: Llama a `create-withdrawal-request`, `get-withdrawal-request`, `get-current-signer-data`, `complete-withdrawal-accept`, y `complete-withdrawal-reject` para gestionar solicitudes de retiro y datos de los firmantes.

## Consideraciones de seguridad

{% stepper %}
{% step %}
**Control de acceso**

Solo el principal firmante actual puede aceptar o rechazar solicitudes de retiro.
{% endstep %}

{% step %}
**Límite de dust**

Impone una cantidad mínima de retiro para evitar spam y garantizar la viabilidad económica.
{% endstep %}

{% step %}
**Gestión de comisiones**

Garantiza que la comisión real no exceda la comisión máxima establecida por el usuario.
{% endstep %}

{% step %}
**Validación de direcciones**

Implementa una validación exhaustiva de los formatos de direcciones de Bitcoin.
{% endstep %}

{% step %}
**Gestión del estado**

Evita el procesamiento doble de solicitudes de retiro.
{% endstep %}
{% endstepper %}

## Tipos de direcciones de Bitcoin

El contrato admite varios tipos de direcciones de Bitcoin, incluidos:

* P2PKH (Pagar-a-Hash-de-Clave-Pública)
* P2SH (Pagar-a-Hash-de-Script)
* P2SH-P2WPKH (P2SH anidado P2WPKH)
* P2SH-P2WSH (P2SH anidado P2WSH)
* P2WPKH (Pagar-a-Hash-de-Clave-Pública-Testigo)
* P2WSH (Pagar-a-Hash-de-Script-Testigo)
* P2TR (Pagar-a-Taproot)

Cada tipo de dirección se representa mediante un byte de versión específico y un formato de hashbytes en la estructura del destinatario.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.stacks.co/learn/es/sbtc/clarity-contracts/sbtc-withdrawal.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
