Documentation Index
Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
Use this file to discover all available pages before exploring further.
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 invariante
CPMM mantiene el invariante clásico de producto constante en sus dos bóvedas: dondex es el saldo de vault0 después de cualquier tarifa de transferencia de Token-2022 al recibir, y lo mismo para y. Cada intercambio debe dejar k' ≥ k después de contabilizar las tarifas comerciales acreditadas al LP (los buckets de protocolo, fondo y creador no se cuentan para k — están en la bóveda pero se excluyen de la vista de la curva, ver Tarifas en la curva abajo). k por lo tanto crece monótonamente en el tiempo conforme los LP acumulan tarifas.
Los tokens de LP se valúan por las reservas del pool, no por k:
Quemar ΔLP tokens de LP devuelve exactamente ΔLP × x / lpSupply de token0 y ΔLP × y / lpSupply de token1. Ni la curva ni k se mueven en depósitos o retiros — solo los swaps cambian el precio.
Modelo de tarifas en la ruta de intercambio
CPMM aplica dos tarifas calificadas independientemente en cada intercambio:- La tarifa comercial se toma del lado del input, cobrada a
AmmConfig.trade_fee_rate. Luego se divide en comparticiones de LP, protocolo y fondo (la compartición de LP se queda en la bóveda y hace crecerk; las comparticiones de protocolo y fondo se extraen de la contabilidad de la bóveda). - La tarifa del creador (activa solo cuando
enable_creator_fee == true) se cobra aAmmConfig.creator_fee_rate. Se toma del lado del input o del lado del output dependiendo dePoolState.creator_fee_ony la dirección del intercambio (verproducts/cpmm/fees). Es su propio bucket — nunca una porción de la tarifa comercial.
FEE_RATE_DENOMINATOR = 1_000_000trade_fee_rate— deAmmConfig, ej.,2500= 0.25% del lado de volumen relevantecreator_fee_rate— deAmmConfig, ej.,1000= 0.10% del lado de volumen relevanteprotocol_fee_rate,fund_fee_rate— denominados en unidades de1/FEE_RATE_DENOMINATORde la tarifa comercial, no de volumen
protocol_fee + fund_fee + creator_fee se mantiene en las bóvedas pero se rastrean por separado en el estado del pool (protocol_fees_token*, fund_fees_token*, creator_fees_token*). Cuando la verificación del invariante de producto constante comprueba k' ≥ k, utiliza saldos de bóveda menos las tres tarifas acumuladas pero no barridas — así que los LP capturan solo lp_fee.
Ver products/cpmm/fees para las instrucciones de recopilación y ejemplos numéricos trabajados.
SwapBaseInput (input exacto)
“El usuario nos da exactamenteamount_in del mint de input y recibe al menos minimum_amount_out del mint de output.”
Ignorando Token-2022 por un momento:
Δx_net = amount_in_after_trade_fee.
El programa luego actualiza la contabilidad de la bóveda de modo que la porción de trade_fee adeudada a protocolo/fondo/creador se sienta en buckets “acumulados” (no incluidos en el siguiente x de la curva), mientras que la compartición de LP se une a x para el siguiente intercambio.
Token-2022 en el lado del input
Si el mint de input tiene una extensión de tarifa de transferencia, el mint deduce su tarifa en la transferencia de usuario → bóveda. Así que la bóveda realmente recibeamount_in − transfer_fee_in(amount_in). El programa CPMM por lo tanto computa:
amount_in_after_trade_fee. Esto importa porque el precio de la curva se computa a partir de la cantidad neta que llegó a la bóveda, no de la cantidad titular del usuario.
Token-2022 en el lado del output
Si el mint de output tiene una tarifa de transferencia, el pool envíaamount_out desde su bóveda al usuario. El mint luego se llevará su tarifa en el camino, así que el usuario recibe amount_out − transfer_fee_out(amount_out). El programa computa amount_out de la curva como de costumbre, pero es responsabilidad del integrador convertir el número de “envío de bóveda” del pool en un número de “recepción del usuario” cuando se muestran cotizaciones.
Verificación de slippage
Después de computaramount_out:
minimum_amount_out para que la constante de slippage se denote en lo que el usuario realmente reciba, no en lo que la bóveda envía.
SwapBaseOutput (output exacto)
“El usuario recibirá exactamenteamount_out del mint de output y está dispuesto a pagar hasta maximum_amount_in del mint de input.”
Invirtiendo la curva para Δx_net:
El techo es importante — garantiza k' ≥ k después del truncamiento de enteros. Luego:
gross_needed.
Verificación de slippage
Ejemplo trabajado
Estado del pool, ignorando Token-2022:x = 1_000_000_000_000(1,000,000.000000 de token0, 6 decimales)y = 2_000_000_000_000(2,000,000.000000 de token1, 6 decimales)AmmConfig:trade_fee_rate = 2500,protocol_fee_rate = 120_000,fund_fee_rate = 40_000,creator_fee_rate = 0
SwapBaseInput con amount_in = 1_000_000_000 (1,000.000000 de token0). Tarifa del creador deshabilitada (enable_creator_fee = false).
enable_creator_fee = true con creator_fee_rate = 1000 (0.10%) en el lado del input, el programa cobraría total_input_fee = ceil(1_000_000_000 * 3500 / 1_000_000) = 3_500_000, luego lo dividiría como creator_fee = 1_000_000 y trade_fee = 2_500_000. La aritmética de protocolo/fondo/LP en trade_fee es sin cambios del ejemplo anterior — la tarifa del creador es su propio bucket, acumulada a creator_fees_token0 y excluida de curve_x junto con los buckets de protocolo y fondo.
Si el mint de input tiene una tarifa de transferencia de Token-2022 del 1%, la bóveda recibe 990_000_000 tokens en lugar de 1_000_000_000, y cada cálculo subsecuente utiliza esa cantidad neta.
Regla de actualización de observación
En cada intercambio, el programa evalúa si debe insertar una nueva observación en el buffer circular:- Precio acumulativo, no precio al contado. Una sola observación no es un precio. Para obtener una TWAP desde el tiempo
t0at1, lee las observaciones más cercanas a cada extremo y computa(cumulative(t1) − cumulative(t0)) / (t1 − t0). - Las muestras están limitadas por velocidad. Swaps sucesivos en el mismo slot pueden compartir una observación. Leer una observación inmediatamente después de un intercambio puede parecer obsoleta por un slot — esto es normal.
products/clmm/accounts.
Tarifas en la curva
Esta es la parte sutil y vale la pena señalarla. La aritmética de la curva funciona contra los saldos netos de la bóveda — es decir, saldo SPL en bruto menos tarifas de protocolo, fondo y creador acumuladas (las tres son buckets independientes — verproducts/cpmm/fees). Una imagen concreta:
- No cotizar a partir de saldos en bruto. Resta primero los campos de tarifa acumulada, o llama a
SwapBaseInputcomo una simulación y toma su devolución. CollectProtocolFeemueve tokens fuera de la bóveda. Después de la recopilación,raw_vault_balancebaja perocurve_balancese mantiene igual; el precio del pool no se mueve. Esto es intencional.
Precisión y desbordamiento
- Toda la aritmética de la curva utiliza intermedios
u128para prevenir desbordamiento enx * y. - La división redondea hacia cero excepto para
Δx_netdeSwapBaseOutput, que redondea hacia arriba, y el cálculo de tarifas, que redondea hacia arriba entrade_feey hacia abajo en las sub-divisiones. Estas direcciones de redondeo se eligen para que el invariante nunca disminuya debido al truncamiento de enteros. - Los pools con proporciones de bóveda extremas (miles de millones : 1) pueden alcanzar pisos de precisión en intercambios pequeños; el programa devuelve
ZeroTradingTokensen ese caso. Verreference/error-codes.
Dónde ir después
products/cpmm/fees— la semántica completa del nivel de tarifa y recopilación.products/cpmm/instructions— las instrucciones que invocan estas matemáticas.algorithms/constant-product— la derivación y casos límite dex · y = kcompartidos entre AMM v4 y CPMM.
raydium-io/raydium-cp-swap— matemáticas de intercambio enstates/curve.rs- Informes de auditoría de Raydium vinculados en
security/audits


