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 →
Esta página es la referencia de instrucciones autorizada. Para código que realmente compone estas instrucciones, consulta
products/cpmm/code-demos. Para los significados de códigos de error, consulta reference/error-codes.Resumen de instrucciones
| Nombre del discriminador | Quién firma | Qué hace |
|---|---|---|
Initialize | creador del pool | Crea un nuevo pool CPMM a partir de dos «mints» y un AmmConfig. Sin permisos; cualquiera puede llamarlo. Codifica enable_creator_fee = false en el nuevo pool. La cuenta pool_state puede ser la PDA canónica o un «keypair» aleatorio recién creado (ver cuentas de Initialize). |
InitializeWithPermission | pagador + titular de una PDA Permission | Variante con permisos de Initialize. El llamador (payer) debe poseer una PDA Permission derivada de su propia clave pública. Se utiliza por plataformas que necesitan creación de pools controlada (p. ej., graduaciones de LaunchLab). Permite al llamador fijar creator_fee_on (BothToken / OnlyToken0 / OnlyToken1) y fuerza enable_creator_fee = true en el nuevo pool. El campo creator en pool_state se establece en una cuenta creator pasada por separado, no en el pagador. Misma flexibilidad PDA-canónica-o-«keypair»-aleatorio para pool_state que en Initialize. |
Deposit | LP | Añade liquidez en ambos tokens; recibe tokens LP. |
Withdraw | LP | Quema tokens LP; recibe ambos tokens subyacentes en proporción. |
SwapBaseInput | intercambiador | Intercambio de entrada exacta (amount_in adentro, ≥ minimum_amount_out afuera). |
SwapBaseOutput | intercambiador | Intercambio de salida exacta (≤ maximum_amount_in adentro, amount_out afuera). |
CollectProtocolFee | protocol_owner (de AmmConfig) | Recauda las comisiones de protocolo acumuladas de los almacenes. |
CollectFundFee | fund_owner (de AmmConfig) | Recauda las comisiones de fondo acumuladas de los almacenes. |
CollectCreatorFee | pool_creator | Recauda las comisiones del creador acumuladas (si se habilitó). |
UpdatePoolStatus | admin | Pausa/reanuda operaciones específicas en un pool mediante una máscara de bits. |
UpdateAmmConfig | admin | Cambia las tasas de comisión o el propietario de protocolo/fondo en un AmmConfig. |
CreateAmmConfig | admin | Crea un nuevo nivel de tarifa (nueva cuenta AmmConfig). |
CreatePermissionPda | admin | Emite una PDA Permission que permite a una autoridad específica llamar a InitializeWithPermission. |
ClosePermissionPda | admin | Revoca una PDA Permission previamente emitida. |
status de cada pool es un u8 donde el bit 0 = depósito deshabilitado, bit 1 = retiro deshabilitado, bit 2 = intercambio deshabilitado (PoolStatusBitIndex { Deposit, Withdraw, Swap } en el programa). Un bit claro significa que la operación está permitida; un bit establecido significa que está pausada. UpdatePoolStatus toma un u8 sin procesar y sobrescribe el valor existente.
Las siguientes secciones detallen cada una. El orden de cuentas sigue el IDL de CPMM; el SDK y el cliente de Rust en raydium-cp-swap/programs/cp-swap/src/instructions coinciden con este orden.
Initialize
Crea un nuevo pool CPMM.
Argumentos
| # | Nombre | W | S | Notas |
|---|---|---|---|---|
| 1 | creator | W | S | Paga renta; se registra como pool_state.pool_creator. |
| 2 | amm_config | El nivel de tarifa elegido. | ||
| 3 | authority | PDA de autoridad global de CPMM. | ||
| 4 | pool_state | W | S* | Se inicializa aquí. O la PDA canónica ["pool", amm_config, token_0_mint, token_1_mint] o un «keypair» aleatorio recién creado — cuando no es la PDA canónica, el programa requiere que pool_state firme (require_eq!(pool_account_info.is_signer, true)). La ruta de «keypair» aleatorio permite que un creador evite intentos de adelantarse en la PDA canónica. Las PDA posteriores (lp_mint, vaults, observation_state) se derivan de pool_state.key() de cualquier forma. |
| 5 | token_0_mint | Ordenado: token_0_mint < token_1_mint. | ||
| 6 | token_1_mint | |||
| 7 | lp_mint | W | Se inicializa aquí. Autoridad establecida en authority. | |
| 8 | creator_token_0 | W | ATA de origen para init_amount_0. | |
| 9 | creator_token_1 | W | ATA de origen para init_amount_1. | |
| 10 | creator_lp_token | W | Destino para LP (se crea si falta). | |
| 11 | token_0_vault | W | Se inicializa aquí. Propiedad de authority. | |
| 12 | token_1_vault | W | ||
| 13 | create_pool_fee | W | ATA de destino para el create_pool_fee pagado por el creador. | |
| 14 | observation_state | W | Se inicializa aquí. | |
| 15 | token_program | Token SPL (para LP mint). | ||
| 16 | token_0_program | Token SPL o Token-2022. | ||
| 17 | token_1_program | Token SPL o Token-2022. | ||
| 18 | associated_token_program | |||
| 19 | system_program | |||
| 20 | rent |
* pool_state firma solo en la ruta de «keypair» aleatorio; la ruta de PDA canónica se ejecuta sin que pool_state firme.
Precondiciones
- Los «mints» están ordenados (
token_0_mint < token_1_mintpor orden de bytes). - Ningún «mint» utiliza una extensión fuera de la lista de permitidos de CPMM (
TransferFeeConfig,MetadataPointer,TokenMetadata,InterestBearingConfig,ScaledUiAmount) — verproducts/cpmm/accounts. Una pequeña lista de permitidos por «mint» dentro del programa omite la verificación para incorporación caso a caso. creatortiene al menosinit_amount_0einit_amount_1en los respectivos ATA.amm_config.disable_create_pool == false.
pool_stateexiste conlp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.- El iniciador LP de
LOCKED_LP(100lámparas de token LP) se bloquea permanentemente en el pool —pool_state.lp_supplyregistraliquidity − 100mientras que100unidades LP permanecen fuera de circulación, evitando que el pool se drene completamente y se divida por cero. observation_statese inicializa;observation_index = 0ypool_id = pool_state.key().- Las lámparas de
create_pool_feese transfieren del creador al receptor y se sincronizan como SOL nativo (es un ATA wSOL). - La máscara de estado del pool es
0(depósito / retiro / intercambio todos habilitados). enable_creator_fee = falseycreator_fee_on = BothToken.Initializeno admite habilitar la comisión del creador — esa ruta esInitializeWithPermission.open_timese incrementa ablock_timestamp + 1si el llamador pasó un valor<= block_timestamp. Los intercambios se rechazan antes deopen_time; depósitos y retiros funcionan inmediatamente.
reference/error-codes)
InvalidInput— «mints» sin ordenar o idénticos.NotSupportMint— extensión de Token-2022 bloqueada.ExceededSlippage— raramente; siinit_amount_0/1resultan en cero LP debido a la falta de coincidencia de decimales.
Deposit
Añade liquidez en ambos tokens proporcional al pool.
Argumentos
| # | Nombre | W | S |
|---|---|---|---|
| 1 | owner | S | |
| 2 | authority | ||
| 3 | pool_state | W | |
| 4 | owner_lp_token | W | |
| 5 | token_0_account | W | |
| 6 | token_1_account | W | |
| 7 | token_0_vault | W | |
| 8 | token_1_vault | W | |
| 9 | token_program | ||
| 10 | token_program_2022 | ||
| 11 | vault_0_mint | ||
| 12 | vault_1_mint | ||
| 13 | lp_mint | W |
k — ambos almacenes y lp_supply se escalan por el mismo factor.
Postcondiciones
lp_supply += lp_token_amount.vault_0 += needed_token_0(neto de cualquier comisión de transferencia de Token-2022 en entrada).vault_1 += needed_token_1(neto de cualquier comisión de transferencia de Token-2022 en entrada).
ExceededSlippage, ZeroTradingTokens, InvalidStatus si el depósito está pausado.
Withdraw
Quema tokens LP y recibe ambos tokens subyacentes en proporción.
Argumentos
| # | Nombre | W | S |
|---|---|---|---|
| 1 | owner | S | |
| 2 | authority | ||
| 3 | pool_state | W | |
| 4 | owner_lp_token | W | |
| 5 | token_0_account | W | |
| 6 | token_1_account | W | |
| 7 | token_0_vault | W | |
| 8 | token_1_vault | W | |
| 9 | token_program | ||
| 10 | token_program_2022 | ||
| 11 | vault_0_mint | ||
| 12 | vault_1_mint | ||
| 13 | lp_mint | W |
Deposit; lp_mint es escribible porque los tokens LP se queman.)
Matemática
lp_supply -= lp_token_amount.- Los almacenes envían
out_token_0/out_token_1(bruto; el usuario recibe neto de cualquier comisión de transferencia de Token-2022).
SwapBaseInput
Intercambio de entrada exacta.
Argumentos
| # | Nombre | W | S |
|---|---|---|---|
| 1 | payer | S | |
| 2 | authority | ||
| 3 | amm_config | ||
| 4 | pool_state | W | |
| 5 | input_token_account | W | |
| 6 | output_token_account | W | |
| 7 | input_vault | W | |
| 8 | output_vault | W | |
| 9 | input_token_program | ||
| 10 | output_token_program | ||
| 11 | input_token_mint | ||
| 12 | output_token_mint | ||
| 13 | observation_state | W |
token_0 / token_1 canónico del pool. El programa determina qué almacén es cuál haciendo coincidir los «mints».
Matemática — ver products/cpmm/math.
Precondiciones
open_time <= now.pool_statuspermite intercambio.- Ningún «mint» pausado o congelado para esta autoridad.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— el comercio se redondea a cero.NotApproved— el pool está pausado para intercambios medianteUpdatePoolStatus.InvalidInput— los «mints» no coinciden con ninguno de los «mints» de almacén del pool.
SwapBaseOutput
Intercambio de salida exacta.
Argumentos
SwapBaseInput.
Matemática — curva inversa con límite máximo, ver products/cpmm/math.
Errores comunes — ExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.
CollectProtocolFee
Recauda las comisiones de protocolo acumuladas de los almacenes al destino del protocolo.
Argumentos — ninguno.
Cuentas
| # | Nombre | W | S | |
|---|---|---|---|---|
| 1 | owner | S | Debe coincidir con amm_config.protocol_owner. | |
| 2 | authority | |||
| 3 | pool_state | W | ||
| 4 | amm_config | |||
| 5 | token_0_vault | W | ||
| 6 | token_1_vault | W | ||
| 7 | vault_0_mint | |||
| 8 | vault_1_mint | |||
| 9 | recipient_token_0_account | W | ||
| 10 | recipient_token_1_account | W | ||
| 11 | token_program | |||
| 12 | token_program_2022 |
NotApproved si el firmante no es protocol_owner.
CollectFundFee
Misma forma que CollectProtocolFee pero firmada por fund_owner e igualando los contadores fund_fees_* a cero.
CollectCreatorFee
De nuevo misma forma, firmada por pool_state.pool_creator. Solo emite transferencias si el pool se inicializó con una tasa de comisión del creador distinta de cero.
UpdatePoolStatus
Pausa o reanuda operaciones individuales en un pool. El campo status es una máscara de bits:
| Bit | Bandera | Efecto cuando está establecida |
|---|---|---|
| 0 | DEPOSIT_DISABLED | Deposit rechaza con NotApproved. |
| 1 | WITHDRAW_DISABLED | Withdraw rechaza. |
| 2 | SWAP_DISABLED | SwapBaseInput / SwapBaseOutput rechazan. |
| # | Nombre | W | S | |
|---|---|---|---|---|
| 1 | authority | S | Debe coincidir con la clave de administrador en el programa CPMM. | |
| 2 | pool_state | W |
security/admin-and-multisig.
CreateAmmConfig
Crea un nuevo nivel de tarifa.
Argumentos
| # | Nombre | W | S | |
|---|---|---|---|---|
| 1 | owner | W | S | Administrador. |
| 2 | amm_config | W | Se inicializa aquí. | |
| 3 | system_program |
- No existe
AmmConfigcon el mismoindex. protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
UpdateAmmConfig
Cambia tasas de comisión u propiedad en un AmmConfig existente. Toma un param: u8 (discriminador para qué campo actualizar) y un value: u64. La semántica de valor por parámetro está en el código fuente; comúnmente:
param = 0→trade_fee_rateparam = 1→protocol_fee_rateparam = 2→fund_fee_rateparam = 3→new_protocol_owner(pasa bytes dePubkeycomo reinterpretación)param = 4→new_fund_ownerparam = 5→create_pool_feeparam = 6→disable_create_pool
AmmConfig en el siguiente intercambio. Sin migración; los pools simplemente leen los nuevos valores.
Matriz de cambio de estado
| Instrucción | lp_supply | Saldos de almacén | Campos de comisión acumulada | observation |
|---|---|---|---|---|
Initialize | + LP inicial | + init_amount_{0,1} | 0 | init |
InitializeWithPermission | + LP inicial | + init_amount_{0,1} | 0 | init |
Deposit | + | + ambos | — | — |
Withdraw | − | − ambos | — | — |
SwapBaseInput | — | + entrada, − salida | + trade_fee dividido en protocolo/fondo; + creator_fee si está habilitado | + (si transcurrió intervalo) |
SwapBaseOutput | — | + entrada, − salida | + trade_fee dividido en protocolo/fondo; + creator_fee si está habilitado | + (si transcurrió intervalo) |
CollectProtocolFee | — | − (por depósitos de protocolo) | protocol_* → 0 | — |
CollectFundFee | — | − (por depósitos de fondo) | fund_* → 0 | — |
CollectCreatorFee | — | − (por depósitos del creador) | creator_* → 0 | — |
UpdatePoolStatus | — | — | — | — |
A dónde ir a continuación
products/cpmm/code-demos— ejemplos de TypeScript ejecutables para lo anterior.reference/error-codes— la tabla completa de errores de Anchor.products/cpmm/fees— el modelo de acumulación de comisiones queCollectProtocolFee/CollectFundFee/CollectCreatorFeevacían.

