Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
Duas taxas independentes, quatro destinos
O CPMM cobra duas taxas com taxas separadas em cada swap:- Taxa de negociação — cobrada em
AmmConfig.trade_fee_ratee dividida entre três destinos:- Participação de LP — permanece no vault e aumenta
k. Reivindicada implicitamente ao queimar tokens LP. - Participação do protocolo — acumulada em
PoolState.protocol_fees_token*; coletada peloprotocol_ownerviaCollectProtocolFee. - Participação do fundo — acumulada em
PoolState.fund_fees_token*; coletada pelofund_ownerviaCollectFundFee.
- Participação de LP — permanece no vault e aumenta
- Taxa de criador (opcional, por pool) — cobrada em
AmmConfig.creator_fee_rateindependentemente da taxa de negociação e acumulada emPoolState.creator_fees_token*. O criador pode coletá-la através deCollectCreatorFee, ou qualquer pagador pode disparar o caminho restrito a destinoCollectCreatorFeePermissionless. Ativa apenas quando o pool foi criado comenable_creator_fee = true.
trade_fee apenas, nunca de creator_fee. Um pool com creator_fee_rate = 1000 (0,10%) e trade_fee_rate = 2500 (0,25%) cobra um total de 0,35% da entrada em um swap com taxa de criador na entrada, dos quais o criador fica com 0,10% e o bucket de taxa de negociação recebe 0,25%.
As taxas de negociação (trade_fee_rate, protocol_fee_rate, fund_fee_rate) e a creator_fee_rate vivem em AmmConfig. O sinalizador enable_creator_fee por pool e o modo creator_fee_on (qual lado da negociação a taxa de criador é cobrada) vivem em PoolState. Veja products/cpmm/accounts.
Taxas e unidades
Todas as taxas sãou64s denominadas em unidades de 1 / FEE_RATE_DENOMINATOR onde FEE_RATE_DENOMINATOR = 1_000_000.
trade_fee_rateé uma fração do volume de swap.2500⇒ 0,25% do lado relevante (entrada ou saída, dependendo decreator_fee_on— veja “Qual lado da negociação as taxas são cobradas” abaixo).creator_fee_rateé uma fração do volume de swap, cobrada separadamente da taxa de negociação.1000⇒ 0,10% do lado relevante.protocol_fee_rateefund_fee_ratesão frações da taxa de negociação, não do volume.120_000⇒ 12% da taxa de negociação.
AmmConfig[index=0] (o pool “padrão” de 0,25%) na mainnet, para referência:
Então em um swap de $1.000 contra
AmmConfig[0] com enable_creator_fee = false: $2,50 de taxa de negociação total, dos quais $2,10 ficam com LPs, $0,30 vão para o protocolo, $0,10 para o fundo. O bucket de criador é 0 porque a taxa de criador está desabilitada.
Se o mesmo pool tivesse enable_creator_fee = true e creator_fee_rate = 1000 (0,10%), o usuário paga um adicional de $1,00 ao bucket de criador — cobrado no mesmo lado da negociação configurado por creator_fee_on — para um total de $3,50 em taxas. O bucket de taxa de negociação e suas divisões de protocolo/fundo permanecem inalterados.
Confirme os valores atuais da mainnet contra GET https://api-v3.raydium.io/main/cpmm-config — as taxas são mutáveis por admin e devem ser lidas novamente em vez de hardcoded.
A divisão, em código
- A taxa total na entrada arredonda para cima para que o pool nunca subcobre.
- As subdivisões de
trade_fee(protocolo, fundo) arredondam para baixo para que sua soma nunca excedatrade_fee; o restante é a participação de LP. lp_share = trade_fee − protocol_fee − fund_fee(creator_fee não é subtraída aqui porque é seu próprio bucket).- A taxa de criador é cobrada da entrada ou saída dependendo de
PoolState.creator_fee_on(veja próxima seção). A taxa permanece inalterada de qualquer forma.
Qual lado da negociação as taxas são cobradas
O CPMM tem uma configuraçãocreator_fee_on por pool (BothToken / OnlyToken0 / OnlyToken1) que determina se a taxa de criador é cobrada do lado da entrada ou do lado da saída de um determinado swap. O auxiliar de tempo de execução is_creator_fee_on_input(direction) reduz isso a um booleano por swap:
Quando a taxa de criador está no lado da entrada, tanto a taxa de negociação quanto a taxa de criador são deduzidas de
amount_in antes da curva ser executada. Matemática de cotação: retire a trade_rate + creator_rate combinada da entrada.
Quando a taxa de criador está no lado da saída, apenas a taxa de negociação é deduzida de amount_in; a curva produz uma saída sem taxa, então a taxa de criador é deduzida dessa saída. Matemática de cotação: retire trade_rate da entrada; retire creator_rate da saída.
A taxa de negociação em si é sempre cobrada no lado da entrada (o padrão Uniswap-V2). Apenas a taxa de criador pode estar na saída.
Como as taxas “acumuladas” interagem com a curva
Uma sutileza importante: as taxas de protocolo, fundo e criador permanecem fisicamente no vault até que sua respectiva instruçãoCollect* seja chamada. Mas elas são excluídas da visão da curva do saldo do vault.
Uma imagem concreta após um swap:
curve_x (e o análogo curve_y) ao aplicar k' ≥ k. É assim que as taxas não-LP chegam aos seus destinos sem inflar a participação de LP do pool.
Consequências que você deve considerar ao projetar:
- Cotar fora de saldos brutos está errado. Se você construir um cotador fora de
getTokenAccountBalance, você consistentemente superestimará o preço que o pool honrará. Sempre subtraia taxas acumuladas, ou simule viaSwapBaseInput/ a API. CollectProtocolFeenão move o preço. Ele move tokens para fora do vault e zera os contadoresprotocol_fees_token*, entãocurve_xecurve_ypermanecem inalterados.- As taxas de LP não se acumulam em um contador. Elas são implícitas no saldo do vault. O direito de LP às taxas de LP acumuladas é exercido ao queimar tokens LP (ou seja, via
Withdraw) — não háCollectLpFee.
Interação com taxas de transferência Token-2022
As taxas de transferência Token-2022 são aplicadas pela mint, não pelo CPMM. Elas atuam em cada transferência de token — swap, depósito, saque e as varredurasCollect*. A matemática de taxa de negociação do CPMM é computada contra o valor que realmente chegou ao vault, ou seja, líquido da taxa de transferência da mint de entrada (se houver).
Então, no pior caso, um usuário paga três impostos distintos em um swap com entrada exata:
- A taxa de transferência da mint de entrada em
amount_in(para a autoridade de taxa da mint). - A
trade_feedo pool no restante (dividida conforme acima). - A taxa de transferência da mint de saída em
amount_out(para a autoridade de taxa da mint).
minimum_amount_out seja denominado no que o usuário realmente recebe. Se você está escrevendo seu próprio cotador, espelhe esse comportamento, ou suas verificações de slippage serão sistematicamente muito generosas.
Veja algorithms/token-2022-transfer-fees para a derivação detalhada.
Taxa de criador
A taxa de criador é opcional e por pool. A taxa vive emAmmConfig.creator_fee_rate; o sinalizador de habilitação e o lado (creator_fee_on) vivem em PoolState:
- Habilitada na criação do pool.
Initializedefineenable_creator_fee = falsepor padrão; pools criados viaInitializeWithPermission(usado por graduações de LaunchLab e outros caminhos controlados) podem passarenable_creator_fee = truee escolhercreator_fee_on. - Taxa compartilhada com o nível de taxa. A taxa em si é
AmmConfig.creator_fee_rate, o mesmo valor em todos os pools vinculados a essa configuração. Cada pool então decide se cobrar (enable_creator_fee) e qual lado do swap cobrar (creator_fee_on). Quandoenable_creator_fee = false, a taxa de criador efetiva do pool é zero independentemente do valor da configuração (vejaPoolState::adjust_creator_fee_ratena fonte). - Independente da taxa de negociação. A taxa de criador nunca reduz as participações de LP / protocolo / fundo — é sua própria taxa, aplicada separadamente, acumulada em seus próprios contadores.
- Varrida via
CollectCreatorFeeouCollectCreatorFeePermissionless. O caminho original requer quePoolState.pool_creatorassine. O caminho sem permissão permite que qualquer pagador dispare a coleta, mas fixa ambos os destinos aos ATAs canônicos do criador. - Não pode ser reabilitada ou redirecionada após a criação. Um pool inicializado com
enable_creator_fee = falsenunca cobrará uma taxa de criador; um inicializado com umcreator_fee_onparticular não pode mudar de lado.
Fluxo operacional de coleta
Os proprietários de protocolo e fundo são o multisig do Raydium na mainnet; veja
security/admin-and-multisig. No caminho original apenas para criador, o signatário criador é a conta registrada em PoolState. No caminho sem permissão, o chamador paga para criar qualquer ATA de criador ausente. O programa restringe creator a pool_state.pool_creator e deriva cada destino desse criador mais a mint do vault correspondente e o programa de token, para que o chamador não possa redirecionar fundos.
Alterando um nível de taxa
As taxas podem ser alteradas pelo admin viaUpdateAmmConfig (veja products/cpmm/instructions). As alterações entram em vigor no próximo swap para cada pool vinculado a esse AmmConfig — não há migração, porque os pools carregam a configuração em cada swap.
O que o admin não pode fazer:
- Mover um pool de um
AmmConfigpara outro. - Reprojetar retroativamente as taxas já acumuladas.
- Coletar taxas sem o signatário
protocol_owner/fund_owner.
Lendo taxas de um pool em execução
Comparação com CLMM e AMM v4
Vejareference/fee-comparison para uma matriz lado a lado. Resumo:
- AMM v4 usa uma taxa de negociação fixa de 0,25% com uma divisão LP/protocolo diferente e sem taxa de fundo.
- CLMM as taxas são por nível de espaçamento de tick, acumuladas por posição (não por pool), e reivindicadas via
DecreaseLiquidityouCollectFees.
Próximos passos
products/cpmm/math— onde a dedução de taxa de negociação se conecta à curva.products/cpmm/instructions— as listas de contas de instruçãoCollect*.algorithms/token-2022-transfer-fees— como combinar corretamente uma taxa de negociação de pool com uma taxa de transferência de mint.

