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 →
Resumen de instrucciones
Máscara de estado: el
status de cada pool es un u8 donde el bit 0 = depósito deshabilitado, bit 1 = retiro deshabilitado, bit 2 = swap 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 detallan cada una. El orden de cuentas sigue el IDL de CPMM; el SDK y el cliente Rust en raydium-cp-swap/programs/cp-swap/src/instructions coinciden con este orden.
Initialize
Crear un nuevo pool CPMM.
Argumentos
* pool_state firma solo en la ruta de keypair aleatoria; la ruta de PDA canónico 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 evita la verificación para incorporación caso por caso. creatortiene al menosinit_amount_0einit_amount_1en los ATAs respectivos.amm_config.disable_create_pool == false.
pool_stateexiste conlp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.- El iniciador de LP de
LOCKED_LP(100láminas de token LP) está permanentemente bloqueado en el pool —pool_state.lp_supplyregistraliquidity − 100mientras que100unidades de 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áminas 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 / swap todos habilitados). enable_creator_fee = falseycreator_fee_on = BothToken.Initializeno admite habilitar la comisión de creador — esa ruta esInitializeWithPermission.open_timese incrementa ablock_timestamp + 1si el llamador pasó un valor<= block_timestamp. Los swaps se rechazan antes deopen_time; los depósitos y retiros funcionan inmediatamente.
reference/error-codes)
InvalidInput— mints sin ordenar o mints idénticos.NotSupportMint— extensión de Token-2022 bloqueada.ExceededSlippage— raramente; siinit_amount_0/1resultan en LP cero debido a desajuste de decimales.
Deposit
Añadir liquidez en ambos tokens proporcional al pool.
Argumentos
Matemáticas
k — ambos vaults 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 la entrada).vault_1 += needed_token_1(neto de cualquier comisión de transferencia de Token-2022 en la entrada).
ExceededSlippage, ZeroTradingTokens, InvalidStatus si el depósito está pausado.
Withdraw
Quemar tokens LP y recibir ambos tokens subyacentes pro-rata.
Argumentos
(Idéntico a
Deposit; lp_mint es escribible porque los tokens LP se queman.)
Matemáticas
lp_supply -= lp_token_amount.- Los vaults envían
out_token_0/out_token_1(bruto; el usuario recibe neto de cualquier comisión de transferencia de Token-2022).
SwapBaseInput
Swap de entrada exacta.
Argumentos
El orden entrada → salida es por la dirección del usuario, no por el
token_0 / token_1 canónico del pool. El programa determina qué vault es cuál haciendo coincidir los mints.
Matemáticas — ver products/cpmm/math.
Precondiciones
open_time <= now.pool_statuspermite swap.- Ningún mint pausado o congelado para esta autoridad.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— la operación se redondea a cero.NotApproved— el pool está pausado para swaps medianteUpdatePoolStatus.InvalidInput— los mints no coinciden con ninguno de los mints del vault del pool.
SwapBaseOutput
Swap de salida exacta.
Argumentos
SwapBaseInput.
Matemáticas — curva inversa con techo, ver products/cpmm/math.
Errores comunes — ExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.
CollectProtocolFee
Recopilar comisiones de protocolo acumuladas de los vaults al destino del protocolo.
Argumentos — ninguno.
Cuentas
Efecto
NotApproved si el firmante no es protocol_owner.
CollectFundFee
Misma forma que CollectProtocolFee pero firmado por fund_owner y poniendo a cero los contadores fund_fees_*.
CollectCreatorFee
Firmado por pool_state.pool_creator. Transfiere los saldos completos de creator_fees_token_0 y creator_fees_token_1 a las cuentas de token del creador, luego pone a cero ambos contadores. Devuelve NoFeeCollect cuando ambos contadores son cero.
CollectCreatorFeePermissionless
Cualquiera puede activar la recopilación de comisiones de creador. La instrucción siempre envía los saldos acumulados completos a las cuentas de token asociadas canónicas propiedad de pool_state.pool_creator; el llamador no puede elegir otro creador o destino. Si falta algún ATA, el pagador financia su creación.
El CollectCreatorFee original sigue siendo invocable, por lo que los clientes existentes permanecen compatibles.
Argumentos — ninguno.
Cuentas
Efecto
- Transfiere todo
creator_fees_token_0ycreator_fees_token_1de los vaults del pool a los ATAs del creador. - Pone a cero ambos contadores de comisión de creador y actualiza
pool_state.recent_epoch. - Devuelve
NoFeeCollectcuando ambos contadores son cero.
UpdatePoolStatus
Pausar o reanudar operaciones individuales en un pool. El campo status es una máscara de bits:
Argumentos
La clave de administrador es la autoridad de actualización en el programa CPMM — en la práctica, el multisig de Raydium. Ver
security/admin-and-multisig.
CreateAmmConfig
Crear un nuevo nivel de comisión.
Argumentos
Precondiciones
- No existe
AmmConfigcon el mismoindex. protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
UpdateAmmConfig
Cambiar tasas de comisión u propiedad en una 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 la fuente; comúnmente:
param = 0→trade_fee_rateparam = 1→protocol_fee_rateparam = 2→fund_fee_rateparam = 3→new_protocol_owner(pasar bytesPubkeycomo reinterpretación)param = 4→new_fund_ownerparam = 5→create_pool_feeparam = 6→disable_create_pool
AmmConfig en el próximo swap. Sin migración; los pools simplemente leen los nuevos valores.
Matriz de cambio de estado
Dónde ir a continuación
products/cpmm/code-demos— ejemplos de TypeScript ejecutables para lo anterior.reference/error-codes— la tabla de errores de Anchor completa.products/cpmm/fees— el modelo de acumulación de comisiones que las instruccionesCollect*Feedrenan.

