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 foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
O invariante
CPMM mantém o invariante clássico de produto constante em seus dois vaults: ondex é o saldo do vault0 após quaisquer transfer-fees do Token-2022 no recebimento, e igualmente para y. Cada swap deve deixar k' ≥ k após contabilizar as taxas de negociação creditadas ao LP (os buckets de protocolo, fundo e criador não contam para k — ficam no vault mas são excluídos da visão da curva, veja Taxas na curva abaixo). k portanto cresce monotonicamente com o tempo conforme os LPs acumulam taxas.
As cotas LP são precificadas pelas reservas do pool, não por k:
Queimar ΔLP tokens LP retorna exatamente ΔLP × x / lpSupply de token0 e ΔLP × y / lpSupply de token1. Nem a curva nem k se movem em depósito ou retirada — apenas swaps mudam o preço.
Modelo de taxa no caminho de swap
CPMM aplica duas taxas independentemente classificadas em cada swap:- A taxa de negociação é cobrada no lado da entrada, aplicada em
AmmConfig.trade_fee_rate. É então dividida em cotas LP, protocolo e fundo (a cota LP permanece no vault e aumentak; as cotas de protocolo e fundo são extraídas da contabilidade do vault). - A taxa de criador (ativa apenas quando
enable_creator_fee == true) é cobrada emAmmConfig.creator_fee_rate. É cobrada no lado entrada ou no lado saída dependendo dePoolState.creator_fee_one da direção do swap (vejaproducts/cpmm/fees). É seu próprio bucket — nunca uma fatia da taxa de negociação.
FEE_RATE_DENOMINATOR = 1_000_000trade_fee_rate— deAmmConfig, ex.,2500= 0,25% do lado de volume relevantecreator_fee_rate— deAmmConfig, ex.,1000= 0,10% do lado de volume relevanteprotocol_fee_rate,fund_fee_rate— denominados em unidades de1/FEE_RATE_DENOMINATORda taxa de negociação, não do volume
protocol_fee + fund_fee + creator_fee é mantida nos vaults mas rastreada separadamente no estado do pool (protocol_fees_token*, fund_fees_token*, creator_fees_token*). Quando a verificação do invariante de produto constante valida k' ≥ k, ela usa saldos do vault menos as três taxas acumuladas não processadas — então LPs capturam apenas lp_fee.
Veja products/cpmm/fees para as instruções de coleta e exemplos numéricos trabalhados.
SwapBaseInput (entrada exata)
“O usuário nos dá exatamenteamount_in do mint de entrada e recebe pelo menos minimum_amount_out do mint de saída.”
Ignorando Token-2022 por um momento:
Δx_net = amount_in_after_trade_fee.
O programa então atualiza a contabilidade do vault de forma que a parcela de trade_fee devida ao protocolo/fundo/criador fique em buckets “acumulados” (não incluídos em x da próxima curva), enquanto a cota LP se une a x para o próximo swap.
Token-2022 no lado da entrada
Se o mint de entrada tem uma extensão de transfer-fee, o mint deduz sua taxa na transferência de usuário → vault. Assim o vault realmente recebeamount_in − transfer_fee_in(amount_in). O programa CPMM portanto calcula:
amount_in_after_trade_fee. Isto importa porque o preço da curva é computado fora da quantidade líquida que chegou ao vault, não fora da quantidade divulgada pelo usuário.
Token-2022 no lado da saída
Se o mint de saída tem uma transfer fee, o pool enviaamount_out de seu vault para o usuário. O mint então aplicará sua taxa na saída, portanto o usuário recebe amount_out − transfer_fee_out(amount_out). O programa calcula amount_out da curva como usual, mas é responsabilidade do integrador converter o número “envio do vault” do pool em um número “recebimento do usuário” ao mostrar cotações.
Verificação de slippage
Após calcularamount_out:
minimum_amount_out para que a constante de slippage seja denominada em o que o usuário realmente receberá, não no que o vault envia.
SwapBaseOutput (saída exata)
“O usuário receberá exatamenteamount_out do mint de saída e está disposto a pagar até maximum_amount_in do mint de entrada.”
Invertendo a curva para Δx_net:
O teto é importante — garante k' ≥ k após truncamento inteiro. Então:
gross_needed.
Verificação de slippage
Exemplo trabalhado
Estado do pool, ignorando Token-2022:x = 1_000_000_000_000(1.000.000,000000 de token0, 6 decimais)y = 2_000_000_000_000(2.000.000,000000 de token1, 6 decimais)AmmConfig:trade_fee_rate = 2500,protocol_fee_rate = 120_000,fund_fee_rate = 40_000,creator_fee_rate = 0
SwapBaseInput com amount_in = 1_000_000_000 (1.000,000000 de token0). Taxa de criador desabilitada (enable_creator_fee = false).
enable_creator_fee = true com creator_fee_rate = 1000 (0,10%) no lado da entrada, o programa cobraria total_input_fee = ceil(1_000_000_000 * 3500 / 1_000_000) = 3_500_000, então dividir como creator_fee = 1_000_000 e trade_fee = 2_500_000. A aritmética protocolo/fundo/LP em trade_fee é inalterada do exemplo acima — a taxa de criador é seu próprio bucket, acumulado a creator_fees_token0 e excluído de curve_x junto com os buckets de protocolo e fundo.
Se o mint de entrada tem uma transfer fee de 1% do Token-2022, o vault recebe 990_000_000 tokens em vez de 1_000_000_000, e cada cálculo subsequente usa essa quantidade líquida.
Regra de atualização de observação
Em cada swap, o programa avalia se deve enviar uma nova observação ao buffer de anel:- Preço cumulativo, não preço spot. Uma única observação não é um preço. Para obter um TWAP do tempo
t0parat1, leia as observações mais próximas de cada extremidade e calcule(cumulative(t1) − cumulative(t0)) / (t1 − t0). - As amostras são limitadas em taxa. Swaps consecutivos no mesmo slot podem compartilhar uma observação. Ler uma observação imediatamente após um swap pode parecer desatualizada por um slot — isto é normal.
products/clmm/accounts.
Taxas na curva
Esta é a parte sutil e vale a pena destacar. A aritmética da curva funciona contra os saldos líquidos do vault — ou seja, saldo SPL bruto menos taxas de protocolo, fundo e criador acumuladas (as três são buckets independentes — vejaproducts/cpmm/fees). Uma imagem concreta:
- Não cotar a partir de saldos brutos. Subtraia os campos de taxa acumulada primeiro, ou chame
SwapBaseInputcomo uma simulação e pegue seu retorno. CollectProtocolFeemove tokens para fora do vault. Após a coleta,raw_vault_balancecai mascurve_balancepermanece inalterado; o preço do pool não se move. Isto é deliberado.
Precisão e overflow
- Toda aritmética da curva usa intermediários
u128para prevenir overflow emx * y. - A divisão arredonda para zero exceto no
Δx_netdeSwapBaseOutput, que arredonda para cima, e na computação de taxas, que arredonda para cima emtrade_feee para baixo nas sub-divisões. Essas direções de arredondamento são escolhidas para que o invariante nunca diminua devido ao truncamento inteiro. - Pools com rácios de vault extremos (bilhões : 1) podem atingir pisos de precisão em negociações pequenas; o programa retorna
ZeroTradingTokensnesse caso. Vejareference/error-codes.
Por onde continuar
products/cpmm/fees— a semântica completa de camadas de taxas e coleta.products/cpmm/instructions— as instruções que invocam esta matemática.algorithms/constant-product— a derivação e casos extremos dex · y = kcompartilhados entre AMM v4 e CPMM.
raydium-io/raydium-cp-swap— matemática de swap emstates/curve.rs- Relatórios de auditoria Raydium vinculados em
security/audits


