Saltar al contenido principal
Esta página fue traducida automáticamente por IA. La versión en inglés es la fuente autorizada.Ver versión en inglés →
El vesting es opcional en un lanzamiento de LaunchLab. Establece vesting_param.total_locked_amount = 0 en Initialize y la sección siguiente no aplica. Una vez habilitado, el calendario es fijo para toda la vida del lanzamiento; el acantilado y los períodos de desbloqueo no pueden cambiar retroactivamente.

Por qué vesting

La curva de vinculación vende base_supply_graduation tokens durante la recaudación de fondos y siembra el pool posterior a la graduación con el resto. El vesting extrae una porción adicional de la oferta, la bloquea durante un acantilado configurable, y luego la libera linealmente a uno o más beneficiarios — típicamente el equipo del creador, asesores o socios de plataforma. Casos de uso prácticos:
  • Asignación de equipo. Un creador reserva, digamos, 5% de la oferta para el equipo fundador, bloqueada durante 6 meses y desbloqueándose linealmente durante los siguientes 12 meses.
  • Asignación de plataforma. Una plataforma de lanzamiento recibe una porción de cada token que lista, en el mismo calendario, a través de CreatePlatformVestingAccount.
  • Subvenciones de asesor / colaborador. Múltiples beneficiarios con sus propias cuentas VestingRecord, cada una rastreando de forma independiente su cantidad reclamada.
Los tokens bloqueados nunca entran en la curva y no son parte del LP de graduación. Permanecen inactivos en el base_vault del pool hasta que cada beneficiario llama a ClaimVestedToken.

Forma del calendario

El vesting para un lanzamiento se describe con tres números, registrados una sola vez en el momento Initialize: Estos tres valores residen en PoolState.vesting_schedule (una estructura VestingSchedule) más el start_time en cadena, que el programa registra como block_time + cliff_period en el momento en que la recaudación de fondos termina exitosamente (cuando se cumplen las condiciones de graduación por primera vez).
allocated_share_amount es la cantidad total ya asignada a cuentas VestingRecord a través de CreateVestingAccount / CreatePlatformVestingAccount. Nunca debe exceder total_locked_amount. Si un creador sobre-asigna, la siguiente llamada a CreateVestingAccount revierte con InvalidTotalLockedAmount.

Fórmula de desbloqueo lineal

Después de que la recaudación de fondos termina, el programa calcula la cantidad acumulada desbloqueada para cada VestingRecord como:
Si unlock_period == 0, toda la token_share_amount se vuelve reclamable en un paso en start_time. De lo contrario, la curva es una línea recta desde 0 en start_time hasta token_share_amount en start_time + unlock_period, limitada a token_share_amount después. La cantidad transferida en cada llamada a ClaimVestedToken es el delta entre la cantidad acumulada desbloqueada recién recompilada y el campo claimed_amount en ejecución en el registro.
Una reclamación antes de start_time revierte con VestingNotStarted. Una reclamación después de start_time + unlock_period liquida el resto completo.

Diseños de cuentas

VestingSchedule

Reside en línea en PoolState. Ver accounts.

VestingRecord

Registro por beneficiario. PDA derivado como:
Un beneficiario puede tener solo un VestingRecord por lanzamiento. Asignar nuevamente al mismo beneficiario en el mismo lanzamiento revierte porque el PDA ya existe.

Instrucciones

CreateVestingAccount

Solo creador. Asigna una porción de la total_locked_amount del pool a un nuevo beneficiario inicializando un nuevo PDA VestingRecord. Argumentos
Cuentas Precondiciones
  • share_amount > 0.
  • pool_state.vesting_schedule.allocated_share_amount + share_amount <= total_locked_amount.
  • La clave pública del beneficiary no tiene VestingRecord existente para este pool.
Postcondiciones
  • vesting_record inicializado con token_share_amount = share_amount, claimed_amount = 0.
  • pool_state.vesting_schedule.allocated_share_amount += share_amount.
Errores comunesInvalidTotalLockedAmount, InvalidInput.

CreatePlatformVestingAccount

Variante de administrador de plataforma de CreateVestingAccount. La billetera de vesting de la plataforma (almacenada en PlatformConfig.platform_vesting_wallet) es el beneficiario, y la porción está limitada por PlatformConfig.platform_vesting_scale. El firmante debe ser igual a platform_config.platform_vesting_wallet. Las otras cuentas reflejan CreateVestingAccount. Usa esto cuando una plataforma se contrata para recibir una porción de vesting fija en cada lanzamiento que lista.

ClaimVestedToken

Solo beneficiario. Transfiere los tokens recientemente desbloqueados del base_vault del pool al ATA del beneficiario. Argumentos Ninguno (el programa calcula la cantidad de reclamación desde el calendario). Cuentas Precondiciones
  • block_time >= pool_state.vesting_schedule.start_time (de lo contrario VestingNotStarted).
  • pool_state.status == PoolStatus::Migrated — la graduación ya debe haber ocurrido. Llamar antes de la graduación revierte.
  • El delta de cantidad desbloqueada es mayor a cero. Una llamada sin operación (delta calculado es 0) revierte.
Postcondiciones
  • vesting_record.claimed_amount avanza a la nueva cantidad acumulada desbloqueada.
  • delta_amount de token base se transfiere a beneficiary_ata.
Errores comunesVestingNotStarted, NoAssetsToCollect, MathOverflow.

Ejemplo trabajado

Un lanzamiento establece:
  • supply = 1_000_000_000
  • total_locked_amount = 100_000_000 (10% de oferta)
  • cliff_period = 180 * 86400 (180 días)
  • unlock_period = 365 * 86400 (1 año lineal después del acantilado)
El creador asigna dos cuentas VestingRecord inmediatamente después de Initialize:
  • Beneficiario A (equipo): share_amount = 70_000_000
  • Beneficiario B (asesor): share_amount = 30_000_000
allocated_share_amount = 100_000_000, igual a total_locked_amount — no hay más asignaciones posibles. La recaudación de fondos se completa en 2027-01-01T00:00Z. El programa establece start_time = 2027-01-01 + 180 días = 2027-06-30. En 2027-09-30 (90 días después de start_time), el Beneficiario A llama a ClaimVestedToken:
La billetera de A recibe 17.26M tokens base. vesting_record.claimed_amount avanza a 17_260_274. Seis meses después (2028-03-31, 270 días después de start_time), A reclama nuevamente:
A recibe otros 34.52M tokens. Después de 2028-06-30 (el final de unlock_period), la siguiente reclamación transfiere los ~18.22M restantes y deja claimed_amount == token_share_amount.

Casos especiales

  • El beneficiario pierde su clave. La clave pública en VestingRecord.beneficiary es el único firmante que puede llamar a ClaimVestedToken. No hay ruta de recuperación. Establece el beneficiario a una multisig si la recuperación es importante.
  • Cuotas de transferencia de Token-2022. Si el mint base es un mint Token-2022 con extensión de cuota de transferencia, el beneficiario recibe delta_amount − transfer_fee, no el delta completo. El vault del pool sigue registrando la cantidad bruta como transferida — la diferencia se acumula en la cuenta de cuota retenida del mint.
  • Pool no graduado. Llamar a ClaimVestedToken antes de la graduación revierte. El reloj de vesting comienza solo cuando la recaudación de fondos realmente se completa; un lanzamiento abortado (que nunca establece start_time) deja tokens bloqueados inaccesibles en el vault.
  • Intentos de sobre-asignación. El programa refuerza allocated_share_amount <= total_locked_amount en cada CreateVestingAccount. El resto (si hay) de total_locked_amount dejado sin asignar está perdido — esos tokens permanecen en el vault por siempre una vez que el lanzamiento se gradúa. Asigna la cantidad completa a menos que sea la intención.

Punteros

Fuentes:
  • raydium-launch/programs/launchpad/src/states/vesting.rsVestingRecord.
  • raydium-launch/programs/launchpad/src/states/pool.rsVestingSchedule, VestingParams, is_vesting_started, vesting_end_time.
  • raydium-launch/programs/launchpad/src/instructions/create_vesting_account.rs.
  • raydium-launch/programs/launchpad/src/instructions/claim_vested_token.rs.