Retiro de sBTC

Resumen

El Contrato de retiro de sBTC (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

1

Control de acceso

Solo el principal firmante actual puede aceptar o rechazar solicitudes de retiro.

2

Límite de dust

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

3

Gestión de comisiones

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

4

Validación de direcciones

Implementa una validación exhaustiva de los formatos de direcciones de Bitcoin.

5

Gestión del estado

Evita el procesamiento doble de solicitudes de retiro.

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.

¿Te fue útil?