# Token sBTC

## Resumen

El [Contrato del token sBTC](https://github.com/stacks-network/sbtc/blob/main/contracts/contracts/sbtc-token.clar) (`sbtc-token.clar`) implementa la funcionalidad de token fungible para sBTC. Administra tanto los tokens sBTC desbloqueados como los bloqueados y proporciona funciones para acuñar, quemar, transferir y consultar información del token. sBTC es un token fungible estándar SIP-010.

## Constantes

* `ERR_NOT_OWNER` (u4): Error cuando el remitente intenta mover un token que no posee.
* `ERR_NOT_AUTH` (u5): Error cuando quien llama no es un llamador de protocolo autorizado.
* `token-decimals` (u8): El número de decimales del token.

## Tokens fungibles

* `sbtc-token`: El token fungible principal de sBTC.
* `sbtc-token-locked`: Representa tokens sBTC bloqueados.

## Variables de datos

* `token-name`: El nombre del token (predeterminado: "sBTC").
* `token-symbol`: El símbolo del token (predeterminado: "sBTC").
* `token-uri`: Un URI opcional para los metadatos del token.

## Funciones del protocolo

Estas funciones solo pueden ser llamadas por contratos de protocolo autorizados:

### protocol-transfer

* Parámetros: `amount: uint`, `sender: principal`, `recipient: principal`
* Devuelve: `(response bool uint)`

### protocol-lock

* Parámetros: `amount: uint`, `owner: principal`
* Devuelve: `(response bool uint)`

### protocol-unlock

* Parámetros: `amount: uint`, `owner: principal`
* Devuelve: `(response bool uint)`

### protocol-mint

* Parámetros: `amount: uint`, `recipient: principal`
* Devuelve: `(response bool uint)`

### protocol-burn

* Parámetros: `amount: uint`, `owner: principal`
* Devuelve: `(response bool uint)`

### protocol-burn-locked

* Parámetros: `amount: uint`, `owner: principal`
* Devuelve: `(response bool uint)`

### protocol-set-name

* Parámetros: `new-name: (string-ascii 32)`
* Devuelve: `(response bool uint)`

### protocol-set-symbol

* Parámetros: `new-symbol: (string-ascii 10)`
* Devuelve: `(response bool uint)`

### protocol-set-token-uri

* Parámetros: `new-uri: (optional (string-utf8 256))`
* Devuelve: `(response bool uint)`

### protocol-mint-many

* Parámetros: `recipients: (list 200 {amount: uint, recipient: principal})`
* Devuelve: `(response (list 200 (response bool uint)) uint)`

## Funciones públicas (SIP-010 Trait)

### transfer

* Parámetros: `amount: uint`, `sender: principal`, `recipient: principal`, `memo: (optional (buff 34))`
* Devuelve: `(response bool uint)`

### get-name

* Devuelve: `(response (string-ascii 32) uint)`

### get-symbol

* Devuelve: `(response (string-ascii 10) uint)`

### get-decimals

* Devuelve: `(response uint uint)`

### get-balance

Devuelve el saldo total (bloqueado + desbloqueado) de un principal.

* Parámetros: `who: principal`
* Devuelve: `(response uint uint)`

### get-balance-available

Devuelve el saldo disponible (desbloqueado) de un principal.

* Parámetros: `who: principal`
* Devuelve: `(response uint uint)`

### get-balance-locked

Devuelve el saldo bloqueado de un principal.

* Parámetros: `who: principal`
* Devuelve: `(response uint uint)`

### get-total-supply

* Devuelve: `(response uint uint)`

### get-token-uri

* Devuelve: `(response (optional (string-utf8 256)) uint)`

## Funciones privadas

### protocol-mint-many-iter

* Función auxiliar para acuñar tokens a varios destinatarios.
* Parámetros: `item: {amount: uint, recipient: principal}`
* Devuelve: `(response bool uint)`

## Consideraciones de seguridad

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

Las funciones de protocolo solo pueden ser llamadas por contratos autorizados, aplicado mediante el `sbtc-registry` contrato.
{% endstep %}

{% step %}
**Verificación de propiedad**

El `transfer` function verifica que el remitente posee los tokens que se están transfiriendo.
{% endstep %}

{% step %}
**Seguimiento separado de tokens**

El contrato mantiene un seguimiento separado de los tokens bloqueados y desbloqueados, garantizando una contabilidad adecuada.
{% endstep %}
{% endstepper %}

## Interacciones con otros contratos

* `.sbtc-registry`: Se usa para validar los llamadores del protocolo para operaciones privilegiadas.
