# Contrato inteligente de Dual Stacking

## Resumen

El contrato Dual Stacking permite a los participantes obtener recompensas sBTC mejoradas al mantener sBTC y, opcionalmente, hacer stacking de STX. Opera en ciclos con instantáneas periódicas para calcular las recompensas según las tenencias y la participación en el stacking.

{% hint style="info" %}
Para ver el contrato Dual Stacking en vivo en mainnet, consulta la página del contrato [aquí](https://explorer.hiro.so/txid/SP1HFCRKEJ8BYW4D0E3FAWHFDX8A25PPAA83HWWZ9.dual-stacking-v1?chain=mainnet).

El 15 de diciembre de 2025, el contrato Dual Stacking se actualizó a [`.dual-stacking-v2_0_2`](https://explorer.hiro.so/txid/SP1HFCRKEJ8BYW4D0E3FAWHFDX8A25PPAA83HWWZ9.dual-stacking-v2_0_2?chain=mainnet)
{% endhint %}

### Arquitectura descentralizada

* Operaciones sin permisos: cualquiera puede ejecutar operaciones críticas del ciclo, incluidas la captura de instantáneas, la propuesta/validación de la proporción, el cálculo de pesos y la distribución de recompensas.
* Solo datos en cadena: todos los datos de los participantes (saldos de sBTC, cantidades de stacking de STX) se leen directamente de la blockchain; no se requieren oráculos fuera de la cadena ni fuentes de datos de confianza.
* Descubrimiento competitivo de la proporción: varios participantes pueden proponer diferentes proporciones doradas; el sistema valida en función de criterios matemáticos (percentil 95), no de la aprobación de un administrador.
* Ejecución transparente: todas las operaciones se ejecutan en cadena con resultados verificables y registros públicos de eventos.
* Inscripción de autoservicio: los usuarios pueden inscribirse, darse de baja y gestionar su participación de forma independiente.

### Operaciones principales

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

El contrato se inicializa una sola vez con un parámetro de altura de bloque de Stacks que es el primero en el bloque de Bitcoin especificado, o posterior a él, en caso de que no haya ningún bloque STX anclado a él.
{% endstep %}

{% step %}
**Inscripción**

Los usuarios pueden inscribirse por sí mismos para participar con direcciones de recompensa personalizadas. Los protocolos DeFi pueden ser inscritos por un administrador con direcciones personalizadas de seguimiento, stacking y recompensa. Todos los participantes pueden darse de baja o cambiar sus direcciones en cualquier momento.
{% endstep %}

{% step %}
**Instantáneas y ciclos**

Cualquiera puede activar instantáneas periódicas que capturan los saldos de sBTC de los participantes y las cantidades de stacking de STX a partir de datos en cadena basados en intervalos de bloques predefinidos.
{% endstep %}

{% step %}
**Cálculo de la proporción**

Una vez completadas las instantáneas, cualquiera puede proponer una proporción dorada (proporción óptima STX/sBTC), contabilizar las distribuciones de los participantes y validar si su propuesta cumple el criterio del percentil 95 para determinar el punto de referencia de las recompensas máximas.
{% endstep %}

{% step %}
**Cálculo de pesos**

Cualquiera puede activar el cálculo de pesos de los participantes usando la fórmula de Dual Stacking validada, que proporciona hasta un aumento de 10x (configurable) para quienes igualen o superen la proporción dorada.
{% endstep %}

{% step %}
**Recompensas**

Cualquiera puede activar la distribución de recompensas en cada ciclo según los pesos calculados. Los administradores pueden actualizar configuraciones como APR, multiplicador de aumento de rendimiento, longitud de la instantánea y número de instantáneas por ciclo.
{% endstep %}

{% step %}
**Controles administrativos**

Los administradores mantienen los parámetros del protocolo, inscriben/dan de baja protocolos DeFi con configuraciones especiales de direcciones, gestionan listas blancas y negras, y pueden realizar operaciones de emergencia si es necesario.
{% endstep %}
{% endstepper %}

***

## Estructura del ciclo

* Cada ciclo consta de un número fijo de instantáneas (14 por defecto).
* Cada instantánea ocurre después de un número establecido de bloques de Bitcoin (150 por defecto).
* La duración total del ciclo es, por tanto, de 2100 bloques de Bitcoin por defecto (14 instantáneas × 150 bloques).
* Estos valores predeterminados pueden ajustarse para entornos de producción (por ejemplo, 1 instantánea por día con los conteos de bloques apropiados).

## Fórmula de Dual Stacking

Cálculo de pesos:

$$
w\_i = \cfrac{\[B\_i \cdot (1 + M \cdot \sqrt{r\_i})]}{n}
$$

Donde:

* *w*<sub>*i*</sub>*&#x20;= peso para el usuario i*
* *B*<sub>*i*</sub>*&#x20;= saldo de sBTC del usuario i (suma en todas las instantáneas)*
* *M = multiplicador de aumento de rendimiento (predeterminado 9, lo que significa un aumento máximo de 10x)*
* *r*<sub>*i*</sub>*&#x20;= min(d*<sub>*i*</sub>*/D, 1), el factor de ajuste de la proporción*
* *d*<sub>*i*</sub>*&#x20;= S*<sub>*i*</sub>*/B*<sub>*i*</sub>*&#x20;, proporción personal STX/sBTC del usuario*
* *S*<sub>*i*</sub>*&#x20;= STX acumulado por el usuario i (suma en todas las instantáneas)*
* *D = proporción dorada (percentil 95 de la proporción STX/sBTC entre todos los participantes)*
* *n = número de instantáneas por ciclo (14 por defecto)*

Distribución de recompensas:

$$
R\_i = (\frac{w\_i}{Σw}) \cdot Total Rewards
$$

Donde:

* *R*<sub>*i*</sub>*&#x20;= recompensa para el usuario i*
* *Σw = suma de todos los pesos de los participantes*
* *Recompensas totales = min(saldo del fondo, tope basado en APR)*

Propiedades clave:

* *Los participantes con d*<sub>*i*</sub>*&#x20;≥ D reciben el aumento máximo de (M+1) x (10x por defecto).*
* *Los participantes con d*<sub>*i*</sub>*&#x20;= 0 (sin STX acumulado) reciben recompensas base (1x).*
* *El aumento se escala con la raíz cuadrada de la proporción para valores intermedios.*
* *Las direcciones de seguimiento de DeFi incluidas en la lista blanca reciben automáticamente el aumento máximo sin necesidad de acumular STX.*
* *Los pesos se dividen por el número de instantáneas por ciclo para normalizar a lo largo de la duración del ciclo.*

***

## Flujo de trabajo del ciclo

El contrato inteligente de Dual Stacking opera en ciclos, cada uno dividido en instantáneas. El proceso garantiza una distribución precisa de recompensas mediante una serie de operaciones sin permisos que cualquiera puede ejecutar.

{% stepper %}
{% step %}
**Fase de instantáneas (cualquiera puede ejecutar)**

* capture-snapshot-balances: cualquiera puede capturar los saldos de los usuarios inscritos después de cada instantánea.
* advance-to-next-snapshot: cualquiera puede pasar a la siguiente instantánea.
* finalize-snapshots: cualquiera puede concluir todos los datos de instantáneas después de la instantánea final.
  {% endstep %}

{% step %}
**Fase de validación de proporción (competitiva y sin permisos)**

* propose-golden-ratio: cualquiera puede proponer una proporción dorada.
* tally-participant-ratios: el proponente contabiliza las proporciones de los participantes en relación con la proporción propuesta.
* validate-ratio: el proponente valida su propuesta; solo tiene éxito si representa el percentil 95.
* Se pueden presentar varias propuestas; la primera válida queda fijada para el ciclo.
  {% endstep %}

{% step %}
**Fase de cálculo de pesos (cualquiera puede ejecutar)**

* calculate-participant-weights: cualquiera puede calcular los pesos de los participantes usando la fórmula de Dual Stacking.
* finalize-weight-computation: cualquiera puede finalizar el cálculo de pesos.
  {% endstep %}

{% step %}
**Fase de distribución de recompensas (cualquiera puede ejecutar)**

* set-is-distribution-enabled: cualquiera puede habilitar la distribución de recompensas determinando el fondo de recompensas disponible.
* distribute-rewards: cualquiera puede distribuir recompensas a los usuarios inscritos según sus pesos.
* finalize-reward-distribution: cualquiera puede finalizar la distribución de recompensas después de que todos los participantes hayan recibido sus recompensas.
  {% endstep %}

{% step %}
**Transición de ciclo (cualquiera puede ejecutar)**

* advance-to-next-cycle: cualquiera puede avanzar al siguiente ciclo después de que todas las recompensas hayan sido distribuidas.
  {% endstep %}
  {% endstepper %}

Nota: Todas las operaciones leen datos directamente de la blockchain (saldos de sBTC desde el contrato del token sBTC, stacking de STX desde el protocolo nativo de Stacks). No se requieren fuentes de datos fuera de la cadena ni intermediarios de confianza.

***

## Funciones públicas

### 1. Inicialización del contrato

#### initialize-contract

Activa el contrato con un ciclo inicial.

* Parámetros: stx-block-height (uint)
* Afirmaciones:
  * La altura actual del bloque de Bitcoin debe ser >= la altura del bloque de Bitcoin de inicio del ciclo configurada.
  * El contrato no debe estar activo.
  * La altura del bloque de Stacks debe encuadrar la altura del bloque de Bitcoin configurada.
* Efecto:
  * Inicializa las variables de estado para el primer ciclo y marca el contrato como activo.
  * Registra los datos del ciclo y la primera instantánea.

#### update-initialize-block

Actualiza la altura del bloque de Bitcoin de inicialización antes de que se active el contrato.

* Parámetros: new-bitcoin-block-height (uint)
* Afirmaciones:
  * El contrato no debe estar activo.
  * El remitente debe ser el administrador.
* Efecto:
  * Actualiza la altura del bloque de Bitcoin de inicio para el primer ciclo.

#### update-cycle-data-before-initialized

Actualiza tanto las instantáneas por ciclo como los bloques por instantánea para el primer ciclo antes de la inicialización.

* Parámetros: updated-snapshots-per-cycle (uint), updated-blocks-per-snapshot (uint)
* Afirmaciones:
  * El contrato no debe estar activo.
  * El remitente debe ser el administrador.
* Efecto:
  * Establece la estructura del ciclo para el primer ciclo.

***

### 2. Inscripción

#### enroll

Inscribe al remitente para recibir recompensas en ciclos futuros.

* Parámetros: rewarded-address (optional principal)
* Afirmaciones:
  * El remitente no debe estar ya inscrito.
  * El remitente no debe estar en la lista negra.
  * El remitente debe mantener al menos la cantidad mínima requerida de sBTC.
* Efecto:
  * Añade al remitente al mapa de participantes con las direcciones de seguimiento, stacking y recompensa configuradas adecuadamente.
  * Incrementa el conteo de participantes del siguiente ciclo.

#### enroll-defi

Inscribe un protocolo DeFi para recompensas con direcciones personalizadas (solo administrador).

* Parámetros:
  * defi-contract (principal)
  * tracking-address (principal)
  * rewarded-address (principal)
  * stacking-address (optional principal)
* Afirmaciones:
  * El remitente debe ser el administrador.
  * El contrato DeFi no debe estar ya inscrito.
  * El contrato DeFi no debe estar en la lista negra.
* Efecto:
  * Añade el protocolo DeFi al mapa de participantes con direcciones personalizadas.
  * Incrementa el conteo de participantes del siguiente ciclo.

#### enroll-defi-batch

Inscribe por lotes múltiples protocolos DeFi (solo administrador).

* Parámetros: defi-contracts (list 900 {...})
* Afirmaciones:
  * El remitente debe ser el administrador.
* Efecto:
  * Inscribe múltiples protocolos DeFi en una sola transacción.

#### opt-out

Permite al remitente darse de baja de la participación en ciclos futuros.

* Afirmaciones:
  * El remitente debe estar inscrito.
* Efecto:
  * Elimina al remitente del mapa de participantes.
  * Disminuye el conteo de participantes del siguiente ciclo.

#### opt-out-defi

Da de baja a un protocolo DeFi de la participación (solo administrador).

* Parámetros: defi-contract (principal)
* Afirmaciones:
  * El remitente debe ser el administrador.
  * El contrato DeFi debe estar inscrito.
* Efecto:
  * Elimina el protocolo DeFi del mapa de participantes.

#### opt-out-defi-batch

Da de baja por lotes a múltiples protocolos DeFi (solo administrador).

* Parámetros: defi-contracts (list 200 principal)
* Afirmaciones:
  * El remitente debe ser el administrador.
* Efecto:
  * Da de baja a múltiples protocolos DeFi en una sola transacción.

***

### 3. Gestión de direcciones de participantes

* change-reward-address
* change-reward-address-defi
* change-stacking-address-defi
* change-tracking-address-defi
* change-addresses-defi
* change-addresses-defi-batch

(Cada función tiene parámetros, afirmaciones solo de administrador cuando corresponde, y actualiza las direcciones del participante/DeFi según se describe en la especificación original.)

***

### 4. Instantáneas y ciclos

#### capture-snapshot-balances

Captura los saldos de instantánea para una lista de participantes en la altura actual del bloque de instantánea. Sin permisos.

* Parámetros: principals (lista de hasta 900 principales)
* Afirmaciones:
  * El contrato debe estar activo.
  * La altura actual del bloque de Stacks de la instantánea debe estar disponible.
* Efecto:
  * Lee el saldo de sBTC del contrato del token sBTC para cada participante.
  * Lee la cantidad de STX acumulada desde el protocolo nativo de Stacks (incluido el stacking líquido si está habilitado).
  * Actualiza los totales de la instantánea y las tenencias de los participantes.
  * Rastrea las direcciones de stacking y de seguimiento.

#### advance-to-next-snapshot

Avanza el contrato a la siguiente instantánea dentro del ciclo actual. Sin permisos.

* Parámetros: new-stx-block-height (uint)
* Afirmaciones:
  * El contrato debe estar activo.
  * Todos los participantes deben haber sido capturados en instantánea.
  * La altura actual del bloque de Bitcoin debe haber alcanzado el bloque de la siguiente instantánea.
  * El ciclo no debe haber terminado.
  * La altura del bloque de Stacks debe encuadrar la altura del bloque de Bitcoin de la siguiente instantánea.
* Efecto:
  * Incrementa el índice de instantánea.
  * Acumula los totales de instantánea en los totales del ciclo.
  * Reinicia los contadores de instantánea.
  * Registra las nuevas alturas de bloque de la instantánea.

#### finalize-snapshots

Finaliza todas las instantáneas del ciclo actual después de completar la última instantánea. Sin permisos.

* Afirmaciones:
  * El contrato debe estar activo.
  * Las instantáneas no deben estar ya finalizadas.
  * Debe estar en la última instantánea del ciclo.
  * Todos los participantes deben haber sido capturados en la instantánea final.
* Efecto:
  * Acumula los totales de la instantánea final en los totales del ciclo.
  * Marca las instantáneas como finalizadas.
  * Establece el estado de la última operación como "concluido".
  * Habilita la fase de propuesta de proporción.

#### advance-to-next-cycle

Avanza el contrato al siguiente ciclo después de que todas las recompensas hayan sido distribuidas. Sin permisos.

* Parámetros: stx-block-height (uint)
* Afirmaciones:
  * El contrato debe estar activo.
  * La altura actual del bloque de Bitcoin debe haber alcanzado el siguiente ciclo.
  * Todos los participantes deben haber recibido recompensas.
  * La distribución de recompensas debe estar finalizada.
  * La altura del bloque de Stacks debe encuadrar la altura del bloque de Bitcoin del siguiente ciclo.
* Efecto:
  * Incrementa el ID del ciclo.
  * Reinicia las variables de estado para el nuevo ciclo.
  * Actualiza la configuración del ciclo desde los ajustes del siguiente ciclo.
  * Inicializa la primera instantánea del nuevo ciclo.

***

### 5. Cálculo y validación de proporción

#### propose-golden-ratio

Propone una proporción dorada para el ciclo actual. Sin permisos.

* Parámetros: ratio (uint) — proporción propuesta escalada por 10^8
* Afirmaciones:
  * Las instantáneas deben estar finalizadas.
  * No debe haber ya una proporción validada para este ciclo.
  * El remitente no debe haber propuesto ya una proporción para este ciclo.
* Efecto:
  * Registra la proporción propuesta para el remitente.
  * Inicializa el seguimiento para el conteo de participantes.
  * Establece el estado de la última operación como "proporción-propuesta".

#### change-proposed-golden-ratio

Cambia una proporción dorada propuesta previamente antes de la validación.

* Parámetros: ratio (uint)
* Afirmaciones:
  * El remitente debe haber propuesto ya una proporción.
  * La proporción aún no debe estar validada.
* Efecto:
  * Actualiza la proporción propuesta y restablece los datos del conteo.

#### tally-participant-ratios

Cuenta cuántos participantes tienen proporciones por encima, por debajo o iguales a la proporción dorada propuesta.

* Parámetros: principals (lista de hasta 900 principales)
* Afirmaciones:
  * El remitente debe haber propuesto una proporción.
  * La proporción aún no debe estar validada.
  * No debe haber ya contabilizado a todos los participantes.
* Efecto:
  * Calcula la proporción STX/sBTC de cada participante.
  * Rastrea las cantidades de sBTC por encima, por debajo y iguales a la proporción propuesta.
  * Incrementa los participantes contabilizados.

#### validate-ratio

Valida que la proporción propuesta represente el percentil 95 de las proporciones de los participantes.

* Afirmaciones:
  * El remitente debe haber propuesto una proporción.
  * Todos los participantes deben haber sido contabilizados.
  * La proporción no debe estar ya validada.
  * Si nadie ha acumulado STX, la proporción debe ser igual a 1.0 (línea base).
  * El sBTC por encima de la proporción debe ser ≤ 5 % del sBTC total.
  * El sBTC en la proporción o por encima de ella debe ser ≥ 5 % del sBTC total.
* Efecto:
  * Marca la proporción como validada.
  * Registra la proporción validada para el ciclo.
  * Establece el estado de la última operación como "proporción-validada".

#### set-max-percentage-above-ratio

Actualiza el umbral porcentual para la validación (solo administrador).

* Parámetros: new-max-percentage-above-ratio (uint) — 500 por defecto = 5 %
* Afirmaciones:
  * El remitente debe ser el administrador.
* Efecto:
  * Actualiza el umbral de validación.

***

### 6. Cálculo de pesos

#### calculate-participant-weights

Calcula los pesos de los participantes usando la fórmula de Dual Stacking. Sin permisos.

* Parámetros: principals (lista de hasta 900 principales)
* Afirmaciones:
  * La proporción debe estar validada.
  * La altura actual del bloque de Stacks del ciclo debe estar disponible.
* Efecto:
  * Recupera la proporción dorada validada D.
  * Aplica un umbral mínimo a D para evitar división por cero $$D = max(D, 10^-8)$$.
  * Para cada participante, calcula el peso usando: $$w\_i = \cfrac{\[B\_i \cdot (1 + M \cdot √r\_i)]}{n}$$
  * Acumula los pesos totales en total-weights-sum.
  * Registra pesos individuales por dirección de seguimiento (no por dirección inscrita).

Notas:

* Varias direcciones inscritas que compartan la misma dirección de seguimiento compartirán el mismo peso.
* Puede llamarse en lotes de hasta 900 participantes.

#### finalize-weight-computation

Finaliza la fase de cálculo de pesos. Sin permisos.

* Afirmaciones:
  * La proporción debe estar validada.
  * Los pesos no deben estar ya finalizados.
  * Todos los participantes deben tener sus pesos calculados.
* Efecto:
  * Marca los pesos como calculados.
  * Establece el estado de la última operación como "pesos-finalizados".
  * Habilita la fase de distribución de recompensas.

***

### 7. Distribución de recompensas

#### set-is-distribution-enabled

Prepara el contrato para distribuir recompensas determinando el fondo de recompensas disponible. Sin permisos.

* Afirmaciones:
  * El contrato debe estar activo.
  * La distribución no debe estar ya habilitada.
  * Los pesos deben estar calculados.
* Efecto:
  * Lee el saldo de sBTC del contrato.
  * Calcula las recompensas a distribuir: min(saldo del fondo, tope basado en APR).
  * El tope es: $$(CPR × total-weights-sum) / (M + 1)$$
  * Marca las recompensas como listas para distribuir.
  * Establece el estado de la última operación como "se-puede-distribuir".

#### distribute-rewards

Distribuye recompensas a los participantes según sus pesos calculados. Sin permisos.

* Parámetros: principals (lista de hasta 900 principales)
* Afirmaciones:
  * La distribución debe estar habilitada.
* Efecto:
  * Calcula la recompensa para cada participante: (peso / pesos-totales) × recompensas-totales
  * Transfiere las recompensas sBTC a las direcciones recompensadas.
  * Marca a los participantes como recompensados.
  * Acumula las recompensas por dirección recompensada.

Notas:

* Puede llamarse en lotes de hasta 900 participantes.
* Varias direcciones inscritas que compartan la misma dirección recompensada acumulan recompensas y solo activan una transferencia por dirección de seguimiento.

#### finalize-reward-distribution

Marca la distribución de recompensas como finalizada para el ciclo actual. Sin permisos.

* Afirmaciones:
  * El contrato debe estar activo.
  * Todos los participantes deben haber recibido recompensas.
  * La distribución debe estar habilitada.
  * No debe estar ya finalizada.
* Efecto:
  * Registra la altura del bloque de finalización.
  * Establece el estado de la última operación como "finalizado".
  * Habilita el avance de ciclo.
  * Activa protocolos DeFi externos para distribuir sus recompensas internas (monitorean este evento de finalización).

***

### 8. Controles administrativos

* update-admin
* update-min-sbtc-hold-required-for-enrollment
* update-snapshot-length
* update-snapshots-per-cycle
* update-cycle-data
* update-bitcoin-blocks-per-year
* update-APR
* update-yield-boost-multiplier
* set-liquid-stacking
* emergency-withdraw-sbtc

(Cada una de las anteriores tiene parámetros, afirmaciones solo de administrador cuando corresponda, y efectos descritos en la especificación original. Las restricciones notables incluyen límites de APR y límites del multiplicador.)

***

### 9. Gestión de la lista negra

* add-blacklisted
* add-blacklisted-batch
* remove-blacklisted
* remove-blacklisted-batch

(Operaciones solo de administrador para gestionar la lista negra; agregar una dirección inscrita la da de baja automáticamente.)

***

### 10. Gestión de la lista blanca de DeFi

#### whitelist-defi-tracking

Añade una dirección de seguimiento de DeFi a la lista blanca (otorga automáticamente el aumento máximo de peso).

* Parámetros: defi-rewards-contract (principal)
* Afirmaciones:
  * El remitente debe ser el administrador.
  * La dirección no debe estar ya en la lista blanca.
* Efecto:
  * Añade la dirección de seguimiento a la lista blanca.
  * Las direcciones en la lista blanca reciben el aumento máximo (r<sub>i</sub> = 1.0) en los cálculos de peso.
  * Durante las instantáneas, a las direcciones en la lista blanca se les registra su stacking de STX como 0 (no necesitan acumular STX para recibir el aumento máximo).

#### remove-whitelisted-defi-tracking

Elimina una dirección de seguimiento de DeFi de la lista blanca (solo administrador).

* Parámetros: defi-rewards-contract (principal)
* Afirmaciones:
  * El remitente debe ser el administrador.
  * La dirección debe estar en la lista blanca.
* Efecto:
  * Elimina la dirección de seguimiento de la lista blanca.

#### remove-whitelisted-defi-tracking-batch

Elimina por lotes direcciones de seguimiento de DeFi de la lista blanca (solo administrador).

* Parámetros: defi-rewards-contract (list 200 principal)
* Afirmaciones:
  * El remitente debe ser el administrador.
* Efecto:
  * Elimina múltiples direcciones de seguimiento de la lista blanca.

***

## Funciones privadas

* update-snapshot-for-new-cycle: reinicia los contadores de instantánea y establece las alturas iniciales del bloque de la instantánea.
* reset-state-for-cycle: aplica la configuración del siguiente ciclo, reinicia indicadores y totales, registra los datos del ciclo, actualiza el conteo de participantes.
* capture-participant-balances: lee sBTC y STX acumulados en la altura de la instantánea, actualiza las tenencias y agrega totales.
* calculate-participant-weight: calcula el peso por dirección de seguimiento usando la fórmula de Dual Stacking (los detalles de matemáticas enteras están en la especificación original).
* tally-user-ratio: clasifica la proporción de un usuario en relación con una proporción propuesta y acumula los totales de sBTC.
* distribute-reward-user: transfiere la recompensa por dirección de seguimiento y actualiza el estado de recompensa.
* remove-participant: elimina al participante y disminuye los conteos.
* enroll-defi-one / change-addresses-defi-one: ayudantes para operaciones por lotes.
* is-blacklisted: verifica la pertenencia a la lista negra.

(Las funciones privadas implementan los efectos descritos y las consideraciones de escalado entero; consulta los detalles de las funciones arriba para el comportamiento matemático/de escalado.)

***

## Funciones de solo lectura

### Información del ciclo

* get-current-cycle-id
* cycle-data
* get-cycle-current-state
* current-overview-data
* get-yield-cycle-data
* nr-cycles-year
* cycle-percentage-rate

### Información de instantáneas

* snapshot-data
* get-stacks-block-height-for-cycle-snapshot
* get-bitcoin-block-height-for-cycle-snapshot

### Información de recompensas

* get-reward-distribution-status
* is-distribution-ready
* reward-amount-for-cycle-and-address
* reward-amount-for-cycle-and-reward-address
* is-distribution-finalized-for-current-cycle
* get-distribution-finalized-at-height

### Información de proporción y peso

* get-ratio-data
* get-weight-computation-status
* get-participant-weight

### Información de participantes

* is-enrolled-in-next-cycle
* is-enrolled-this-cycle
* get-is-blacklisted
* get-is-blacklisted-list
* get-is-whitelisted-defi
* get-latest-reward-address
* get-participant-cycle-info

### Estado y configuración

* get-last-operation-state
* get-admin
* get-is-contract-active
* get-current-bitcoin-block-height
* get-minimum-enrollment-amount
* get-next-action-bitcoin-height
* get-contract-sbtc-balance
* get-apr-data

### Consultas de stacking de STX

* get-amount-stx-stacked
* get-amount-stx-stacked-at-block-height
* get-amount-stacked-at-block-height
* get-amount-stacked-now


---

# 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/dual-stacking/contracts.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.
