Skip to main content
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 →
LaunchLab expone un conjunto de instrucciones compacto: seis llamadas orientadas al usuario más un puñado de primitivas administrativas. El SDK las envuelve todas; esta página documenta la superficie bruta para agregadores, herramientas de monitoreo y programas que necesitan CPI.

Inventario de instrucciones

La división “ExactIn/ExactOut” refleja SwapBaseInput / SwapBaseOutput de CPMM — en cadena son discriminadores de instrucción separados con redondeo ligeramente diferente. Selección de ruta de graduación. Cada nueva llamada a Initialize, InitializeV2 e InitializeWithToken2022 debe establecer migrate_type = 1 (CPSWAP). Cualquier intento de inicializar un nuevo pool vinculado a AMM v4 devuelve MigrateTypeNotMatch. amm_creator_fee_on solo selecciona si la tarifa de creador CPMM resultante se aplica al token de cotización o a ambos tokens; no selecciona el programa de destino. MigrateToAmm sigue siendo invocable para un PoolState existente que fue inicializado con migrate_type = 0 antes de esta restricción. La versión no reescribe el estado del pool existente ni elimina la instrucción heredada. Programa de token del lado de la cotización. El mint de cotización puede ser propiedad del programa SPL Token o Token-2022. Cada instrucción que lo toca — CreateConfig, InitializeV2, InitializeWithToken2022, las cuatro instrucciones de comercio, CollectFee, CollectMigrateFee, ClaimCreatorFee, ClaimPlatformFee y ClaimPlatformFeeFromVault — toma el programa propietario en su ranura de cuenta de programa de cotización. Las posiciones de cuenta no cambiaron; solo el valor aceptado cambió. Pasa el programa que realmente posee GlobalConfig.quote_mint, que puedes leer desde el bit1 de PoolState.token_program_flag para un lanzamiento existente (ver accounts) o desde el propietario de la cuenta de mint de otra manera. El Initialize deprecado es la excepción: su cuenta de programa de cotización sigue siendo tipificada a SPL Token, por lo que una configuración cuyo mint de cotización es Token-2022 debe lanzarse a través de InitializeV2 o InitializeWithToken2022. MigrateToCpswap es la otra excepción, en la dirección opuesta — toma ambos programas incondicionalmente en lugar de uno por mint. Ver las cuentas de migración a continuación.

Initialize

Crear un nuevo lanzamiento. Argumentos
Cuentas (abreviado) Precondiciones
  • quote_mint ∈ launch_config.allowed_quote_mints.
  • base_supply_graduation ≤ base_supply_max.
  • Los parámetros de tarifa pasan las comprobaciones launch_config.max_*_fee_rate.
  • open_time ≥ now − slop (SDK aplica ≥ now; el programa tolera un ligero antedatado).
  • curve_type es reconocido.
Postcondiciones
  • base_mint tiene supply = base_supply_max, todo en base_vault.
  • base_mint.mint_authority = launch_authority, freeze_authority = None.
  • LaunchState inicializado con status = Active, base_sold = 0, quote_reserve_real = 0.
  • quote_reserve_target calculado a partir de parámetros de curva + base_supply_graduation + buy_numerator (aproximadamente).
  • Para InitializeWithToken2022 con un TransferFeeConfig adjunto: transfer_fee_config_authority = launch_authority, y withdraw_withheld_authority = PlatformConfig.transfer_fee_extension_auth cuando ese campo está establecido, de lo contrario launch_authority. El lado de retiro se escribe en la creación de mint precisamente para que la plataforma pueda barrer tarifas retenidas antes de la graduación. Ver platform-config.
Errores comunesInvalidQuoteMint, FeeRateTooHigh, InvalidCurveParams, MathOverflow.

Buy (variante canónica: BuyExactIn)

El usuario proporciona un quote_in fijo; la curva calcula base_out. Argumentos
Cuentas Precondiciones
  • launch_state.status == Active.
  • now ≥ open_time.
  • user_quote_ata.balance ≥ quote_in.
  • quote_in > 0.
Efecto
  1. Dividir quote_in en quote_in_after_fee y las partes de tarifa.
  2. Resolver Newton la curva para base_out dada la cotización posterior a la tarifa.
  3. require(base_out ≥ minimum_base_out) de lo contrario revertir ExceededSlippage.
  4. Mover quote_in usuario → bóveda. Mover base_out bóveda → usuario.
  5. Actualizar base_sold += base_out, quote_reserve_real += quote_in_after_fee × (lp_share / total_share).
  6. Actualizar contadores de tarifa (protocol_fees_quote, creator_fees_quote).
  7. state_data.num_buys += 1.
  8. Si quote_reserve_real ≥ quote_reserve_target después de la actualización, el SDK típicamente encadena una instrucción Graduate en la misma transacción. El programa no se gradúa automáticamente dentro de Buy — se requiere un Graduate posterior.

BuyExactOut

El usuario especifica el base_out exacto; el programa calcula quote_in. Argumentos
Las mismas cuentas que BuyExactIn. Usa la integral cuadrática de forma cerrada (o CPMM inverso, para curve_type 1) en lugar de iteración de Newton.

Sell / SellExactIn / SellExactOut

Espejo de Buy. El usuario devuelve base_in a la curva y recibe quote_out. La tarifa se deduce de quote_out, por lo que el usuario recibe menos que los ingresos integrados brutos. Precondiciones
  • user_base_ata.balance ≥ base_in.
  • La venta no puede empujar base_sold por debajo de 0 (redundante con lo anterior dado que la contabilidad es consistente).
  • El lanzamiento es Active.
Efecto — simétrico a Buy. base_sold disminuye, quote_reserve_real disminuye. Las tarifas aún se acumulan.

Tarifas de transferencia del lado de la cotización

Cuando el mint de cotización lleva un TransferFeeConfig, la cantidad que la bóveda mueve y la cantidad que el pagador es debitado o acreditado difieren, y el límite de deslizamiento se verifica contra el lado del pagador. En un mint de cotización sin la extensión, cada caso a continuación es idéntico a un mint heredado simple. Dos consecuencias para cotizar:
  • Un límite calculado como si el mint fuera libre de tarifas es rechazado. Pasar el costo libre de tarifas como maximum_amount_in, o los ingresos libres de tarifas como minimum_amount_out, revierte con ExceededSlippage.
  • real_quote avanza solo por lo que llegó a la bóveda. Un BuyExactIn de amount_in en un mint de cotización del 5% mueve real_quote por amount_in × 0.95.
Un mint de cotización con tarifa del 100% (10000 puntos base) no puede ser invertido y revierte con CalculateOverflow en las rutas exactas de salida. Ambos mints del lado del comercio también están restringidos al programa pasado en su ranura coincidente, por lo que un base_token_program no coincidente ahora falla en lugar de ser ignorado. Ver algorithms/token-2022-transfer-fees para las matemáticas de tarifa subyacentes.

MigrateToAmm / MigrateToCpswap

Graduar un lanzamiento en un pool comercializable una vez que la curva ha alcanzado total_quote_fund_raising. Los nuevos lanzamientos son solo CPMM. MigrateToAmm se retiene para pools existentes cuyo migrate_type almacenado es 0. Quién firma
  • MigrateToAmm — la migrate_to_amm_wallet registrada en la GlobalConfig de vinculación.
  • MigrateToCpswap — la migrate_to_cpswap_wallet registrada en la GlobalConfig de vinculación.
Estas carteras típicamente son mantenidas por el crank de graduación operado por Raydium; en la práctica la graduación ocurre segundos después de que se cruza el umbral, independientemente de quién desencadenó la compra final. Argumentos MigrateToAmm toma tres (principalmente parámetros del mercado OpenBook que el programa reenvía a AMM v4):
MigrateToCpswap no toma ninguno. Efecto (común a ambos)
  1. Verificar pool_state.status == Migrate (es decir, quote_reserve_target ha sido alcanzado). De lo contrario revertir con PoolMigrated (el estado ya era Migrated) o PoolFunding (aún en financiación).
  2. Verificar que pool_state.migrate_type coincida con la instrucción (0 para AMM, 1 para CPMM). De lo contrario revertir con MigrateTypeNotMatch.
  3. Calcular las reservas posteriores a la graduación:
    • base_amount_out = base_vault.amount − vesting_schedule.total_locked_amount
    • quote_amount_out = quote_vault.amount − quote_protocol_fee − migrate_fee − platform_fee
  4. CPI en el programa de destino (AMM v4 Initialize2 o CPMM InitializeWithPermission) con esas reservas para crear el pool posterior a la graduación.
  5. Para migraciones CPMM ejecutadas después de la actualización del 2026-08-17, combinar platform_scale + creator_scale en una participación de LP bloqueada de propiedad de plataforma y acuñar como máximo un NFT de Clave de Tarifa a platform_nft_wallet. Quemar el resto de burn_scale. Antes de la actualización, creator_scale estaba bloqueado por separado y su Clave de Tarifa iba al creador del token. Las migraciones históricas completadas no se modifican. Para la graduación heredada de AMM v4, la disposición de LP sigue el flujo existente de esa instrucción.
  6. Revocar base_mint.mint_authority (establecer a None).
  7. Voltear pool_state.status = Migrated, establecer vesting_schedule.start_time = block_time + cliff_period.
Transferencia de autoridad de extensión de tarifa Token-2022 — cuando el mint base es un mint Token-2022 que lleva TransferFeeConfig y PlatformConfig.transfer_fee_extension_auth no es predeterminado, la migración también reasigna las autoridades de esa extensión a la clave de plataforma:
  • transfer_fee_config_authority siempre es reasignado. El PDA de lanzamiento authority lo mantiene durante toda la fase previa a la graduación, por lo que siempre hay algo que mover.
  • WithheldWithdraw es reasignado solo cuando el PDA authority aún lo mantiene. Los lanzamientos creados a partir del 2026-08-27 en adelante ya llevan transfer_fee_extension_auth en esa autoridad desde la creación de mint, por lo que el paso se omite. La protección es lo que evita que la migración revierta en esos mints — el PDA no puede renunciar a una autoridad que ya no posee.
Si transfer_fee_extension_auth es Pubkey::default() en el momento de la migración, ninguna autoridad se mueve y ambas permanecen con el PDA authority permanentemente. Ver platform-config. PostcondicionesBuyExactIn, BuyExactOut, SellExactIn, SellExactOut rechazarán a partir de este punto con PoolMigrated. El pool AMM resultante es canónico y comercia como cualquier otro pool AMM v4 / CPMM. Errores comunesPoolFunding, PoolMigrated, MigrateTypeNotMatch, InvalidCpSwapConfig, MathOverflow.

Cuentas restantes de migración CPMM

Los clientes que construyen MigrateToCpswap deben usar estos índices de remaining_accounts fijos: La instrucción requiere al menos diez cuentas restantes en la ruta actualizada. Las cuentas de mint de soporte son entradas CPI de solo lectura. Deriva ambas direcciones incluso cuando el mint no tiene un registro de soporte inicializado. Los constructores más antiguos que aún adjuntan cuentas de bloqueo de creador u omiten los índices 8–9 deben ser actualizados.

Programas de token de migración CPMM

MigrateToCpswap toma ambos programas de token incondicionalmente y determina cuál posee cada mint. Sus dos cuentas de programa de token fueron renombradas en consecuencia: Reemplazan el anterior base_token_program (cualquier programa que poseyera el mint base) y quote_token_program (siempre heredado). Las posiciones no cambiaron, por lo que esto es un cambio de valor en lugar de un cambio de diseño — pero los dos valores están cerca de invertirse, y un constructor que sigue pasando su par anterior suministrará Token-2022 donde se requiere el programa heredado tan pronto como cualquiera de los mints sea un mint Token-2022. El programa heredado es requerido incluso cuando ninguno de los mints lo usa, porque el mint de LP de CPMM y el NFT de Clave de Tarifa de liquidez bloqueada siempre viven en él.

Lista de permitidos de GlobalConfig de plataforma

PlatformConfig.restrict_global_config controla la comprobación:
  • 0: la plataforma acepta cualquier GlobalConfig válido de otra manera; no se requiere cuenta de permitidos.
  • 1: Initialize, InitializeV2 e InitializeWithToken2022 deben incluir el PlatformAllowConfig coincidente en cualquier lugar en remaining_accounts.
El admin de plataforma crea o cierra el PDA con CreatePlatformAllowConfig y ClosePlatformAllowConfig. Sus semillas son [b"platform_allow_config", platform_config, global_config]. Las antiguas instrucciones PlatformGlobalAccess administradas por admin y PDA se retiran.

Reglas de parámetros de lanzamiento de plataforma

Cuatro instrucciones gestionan una cuenta PlatformCurveRule. Las cuatro son firmadas por PlatformConfig.curve_rule_manager o por el admin de plataforma — el programa acepta al admin re-derivando el PDA PlatformConfig del firmante, por lo que ninguna cuenta separada lo prueba. Un firmante que no es ninguno de los dos devuelve InvalidCurveRuleAuthority. platform_curve_rule es el PDA en [b"platform_curve_rule", platform_config, global_config].
  • Create asigna la cuenta sin grupo. Ese estado no restringe nada.
  • Update inserta o reemplaza el grupo con ese group_id, reemplazándolo completamente si existe. Redimensiona la cuenta para que quepa, por lo que el firmante completa la renta que crece y recibe de vuelta la renta que se reduce. Un nuevo grupo más allá del décimo devuelve CurveRuleGroupsExceeded; más de 25 restricciones, un campo desconocido u operador, o el mismo par (field, op) dos veces en un grupo devuelve InvalidCurveRuleConstraint; los cuatro campos derivados de TotalSellA en una configuración que no es de producto constante devuelven CurveRuleFieldNotSupportedByCurve.
  • Remove elimina un grupo por id, reduciendo la cuenta y reembolsando la diferencia. Un id desconocido devuelve CurveRuleGroupNotExist.
  • Close devuelve toda la renta al firmante. La configuración es entonces sin restricciones nuevamente incluso mientras restrict_curve_param permanece 1.
Ninguno de los cuatro cambia si las reglas se aplican. Eso es UpdatePlatformConfig::RestrictCurveParam(0 | 1), que solo el admin de plataforma puede llamar. En la ruta de lanzamiento. Mientras restrict_curve_param es 1, InitializeV2 e InitializeWithToken2022 requieren el PDA de regla en remaining_accounts — incluso cuando no existe, para que omitirlo no pueda omitir la comprobación. Una cuenta faltante es NotEnoughRemainingAccounts; un lanzamiento que no satisface ningún grupo es CurveParamNotMatchPlatformRule. La comprobación se ejecuta antes de los propios límites de GlobalConfig y solo puede reducirlos. Modelo y guías: products/launchlab/curve-rules. Ambos errores son evitables del lado del cliente — el SDK refleja esta comprobación como una función pura, ver Verificar antes de enviar.

CollectFee

Barrido administrativo de las tarifas comerciales acumuladas del protocolo en un único lanzamiento. Argumentos — ninguno. Cuentas Efecto — transferir pool_state.quote_protocol_fee desde quote_vault a recipient_token_account, luego poner a cero el contador. Invocable en cualquier momento después de la primera compra.

CollectMigrateFee

Barrido administrativo de la tarifa de migración acumulada en la graduación. La misma forma de cuenta que CollectFee con migrate_fee_owner como firmante (en lugar de protocol_fee_owner) y pool_state.migrate_fee como contador drenado.

ClaimCreatorFee

Barrido por creador de tarifas de creador acumuladas en cada lanzamiento que posee el creador que usa el mismo mint de cotización. Drena la bóveda de tarifa por creador, no la por pool. Argumentos — ninguno. Cuentas Efecto — transferir el saldo completo de creator_fee_vault a recipient_token_account. Revierte con una comprobación de requerimiento mayor que cero si la bóveda está vacía.

ClaimPlatformFee

Barrido por plataforma que drena la bóveda de cotización de un lanzamiento directamente. Usa esto cuando una plataforma quiere reclamar su porción para un lanzamiento específico sin pasar por la bóveda de plataforma agregada. Argumentos — ninguno. Cuentas Efecto — transferir pool_state.platform_fee desde quote_vault a recipient_token_account, poner a cero el contador.

ClaimPlatformFeeFromVault

Barrido agregado por plataforma. Drena la bóveda de tarifa por mint de cotización de la plataforma que acumula tarifas de cada lanzamiento enrutado a través de la plataforma. Argumentos — ninguno. Cuentas Efecto — transferir el saldo completo de platform_fee_vault a recipient_token_account. Revierte si la bóveda está vacía.

Instrucciones de vesting y configuración de plataforma

Estas se documentan en páginas dedicadas porque cada una tiene su propio modelo de estado:

Matriz de cambio de estado

Dónde ir a continuación

Fuentes: