Skip to main content
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:
  1. Taxa de negociação — cobrada em AmmConfig.trade_fee_rate e dividida entre três destinos:
    • Parcela de LP — permanece no vault e aumenta k. Reivindicada implicitamente ao queimar tokens de LP.
    • Parcela do protocolo — acumulada em PoolState.protocol_fees_token*; coletada pelo protocol_owner via CollectProtocolFee.
    • Parcela do fundo — acumulada em PoolState.fund_fees_token*; coletada pelo fund_owner via CollectFundFee.
  2. Taxa do criador (opcional, por pool) — cobrada em AmmConfig.creator_fee_rate independentemente da taxa de negociação e acumulada em PoolState.creator_fees_token*. O criador pode coletá-la via CollectCreatorFee, ou qualquer pagador pode ativar o caminho restrito a destino CollectCreatorFeePermissionless. Ativa apenas quando o pool foi criado com enable_creator_fee = true. Desde a atualização de 2026-09-13, a taxa do criador acumulada é dividida novamente no momento da coleta: uma parcela configurável é movida para o bucket de protocolo do pool e apenas o restante chega ao criador — veja Parcela do protocolo da taxa do criador.
A taxa do criador não é uma fatia da taxa de negociação. As duas taxas são somadas quando a taxa é cobrada na entrada do swap, mas cada uma permanece seu próprio bucket — as parcelas de protocolo e fundo cobradas em um swap sempre são derivadas de 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 bucket do criador recebe 0,10% e o bucket de taxa de negociação recebe 0,25%. A parcela do protocolo da taxa do criador funciona de forma oposta e é fácil confundir com o acima: ela é extraída do bucket do criador, não da taxa de negociação, e não no swap — é aplicada quando CollectCreatorFee ou CollectCreatorFeePermissionless liquida o saldo acumulado. A matemática do swap não é alterada por isso. As taxas de taxa de negociação (trade_fee_rate, protocol_fee_rate, fund_fee_rate), a creator_fee_rate e a creator_fee_share_rate padrão vivem em AmmConfig. A flag enable_creator_fee por pool e o modo creator_fee_on (qual lado da negociação a taxa do criador é cobrada) vivem em PoolState. Uma substituição por criador da taxa de compartilhamento vive em seu próprio PDA CreatorFeeShare. Veja products/cpmm/accounts.

Taxas e unidades

Todas as taxas são u64s 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 de creator_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_rate e fund_fee_rate são frações da taxa de negociação, não do volume. 120_000 ⇒ 12% da taxa de negociação.
  • creator_fee_share_rate é uma fração da taxa do criador acumulada, não do volume e não da taxa de negociação. 200_000 ⇒ 20% do que estiver em creator_fees_token* no momento em que é coletado. 0 (o padrão) deixa toda a taxa do criador com o criador.
Parâmetros padrão para 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 do criador é 0 porque a taxa do 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 para o bucket do 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 serem codificadas.

A divisão, em código

Notas:
  • 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 exceda trade_fee; o restante é a parcela de LP.
  • lp_share = trade_fee − protocol_fee − fund_fee (creator_fee não é subtraído aqui porque é seu próprio bucket).
  • A taxa do 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ção creator_fee_on por pool (BothToken / OnlyToken0 / OnlyToken1) que determina se a taxa do criador é cobrada do lado de entrada ou 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 do criador está no lado de entrada, tanto a taxa de negociação quanto a taxa do criador são deduzidas de amount_in antes da curva ser executada. Matemática de cotação: pegue a trade_rate + creator_rate combinada da entrada. Quando a taxa do criador está no lado de saída, apenas a taxa de negociação é deduzida de amount_in; a curva produz uma saída sem taxa, então a taxa do criador é deduzida dessa saída. Matemática de cotação: pegue trade_rate da entrada; pegue creator_rate da saída. A taxa de negociação em si é sempre cobrada no lado de entrada (o padrão Uniswap-V2). Apenas a taxa do criador pode pousar 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ção Collect* seja chamada. Mas elas são excluídas da visão da curva do saldo do vault. Uma imagem concreta após um swap:
O programa usa curve_x (e o análogo curve_y) ao impor k' ≥ k. É assim que as taxas não-LP chegam aos seus destinos sem inflar a parcela de LP do pool. Consequências que você deve projetar em torno:
  • Citar 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 via SwapBaseInput / a API.
  • CollectProtocolFee não move o preço. Ele move tokens para fora do vault e zera os contadores protocol_fees_token*, então curve_x e curve_y permanecem 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 queimando tokens de 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 varreduras Collect*. 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 de entrada exata:
  1. A taxa de transferência da mint de entrada em amount_in (para a autoridade de taxa da mint).
  2. A trade_fee do pool no restante (dividida conforme acima).
  3. A taxa de transferência da mint de saída em amount_out (para a autoridade de taxa da mint).
O cotador do SDK contabiliza todos os três para que minimum_amount_out seja denominado no que o usuário realmente recebe. Se você estiver 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 do criador

A taxa do criador é opcional e por pool. A taxa vive em AmmConfig.creator_fee_rate; a flag de habilitação e o lado (creator_fee_on) vivem em PoolState:
  • Habilitada na criação do pool. Initialize define enable_creator_fee = false por padrão; pools criados via InitializeWithPermission (usado por graduações de LaunchLab e outros caminhos fechados) podem passar enable_creator_fee = true e escolher creator_fee_on.
  • Taxa é compartilhada com o nível de taxa. A taxa em si é AmmConfig.creator_fee_rate, o mesmo valor em cada pool vinculado a essa configuração. Cada pool então decide se a cobra (enable_creator_fee) e qual lado do swap a cobra (creator_fee_on). Quando enable_creator_fee = false, a taxa de criador efetiva do pool é zero independentemente do valor da configuração (veja PoolState::adjust_creator_fee_rate na fonte).
  • Independente da taxa de negociação. A taxa do criador nunca reduz as parcelas de LP / protocolo / fundo — é sua própria taxa, aplicada separadamente, acumulada em seus próprios contadores.
  • Varrida via CollectCreatorFee ou CollectCreatorFeePermissionless. O caminho original requer que PoolState.pool_creator assine. O caminho sem permissão permite que qualquer pagador ative a coleta, mas fixa ambos os destinos aos ATAs canônicos do criador. Ambos os caminhos liquidam a parcela do protocolo primeiro — veja a próxima seção.
  • Não pode ser reabilitada ou redirecionada após a criação. Um pool inicializado com enable_creator_fee = false nunca cobrará uma taxa de criador; um inicializado com um creator_fee_on particular não pode mudar de lado.
As taxas do criador são o mecanismo por trás do padrão “Burn & Earn” do Raydium: tokens de LP são bloqueados sob o programa LP Lock para que o criador não possa sacar liquidez, mas as taxas do criador acumuladas ainda podem ser coletadas indefinidamente.

Parcela do protocolo da taxa do criador

Desde a atualização de 2026-09-13, o protocolo pode reter uma parcela configurável da taxa do criador. Nada sobre o swap muda: a taxa do criador ainda é cobrada em creator_fee_rate e ainda se acumula integralmente em creator_fees_token{0,1}. A divisão acontece uma vez, no momento da coleta, dentro de CollectCreatorFee e CollectCreatorFeePermissionless.

De onde vem a taxa

Duas fontes, em ordem de prioridade:
  1. PDA CreatorFeeShare — seeds ["creator_fee_share", creator, amm_config]. Quando essa conta existe e é de propriedade do CPMM, sua share_rate vence. Permite que o protocolo negocie uma taxa por criador em um determinado nível de taxa sem tocar no nível em si.
  2. AmmConfig.creator_fee_share_rate — o padrão para cada criador nesse nível de taxa. Usado sempre que o PDA não existe.
Ambos são u64s sobre o mesmo FEE_RATE_DENOMINATOR = 1_000_000, e ambos são limitados ao denominador. As instruções de coleta sempre pegam a conta creator_fee_share, mesmo quando ela nunca foi criada — o programa verifica se está vazia e volta para o padrão. Passar o endereço errado falha na restrição de PDA, não no fallback.

O que a divisão faz

Aplicado independentemente a creator_fees_token_0 e creator_fees_token_1, então:
  • creator_amount_{0,1} é transferido para fora dos vaults para as contas de token do criador.
  • shared_amount_{0,1} é adicionado a protocol_fees_token_{0,1} e permanece no vault até que o proprietário do protocolo o varra com CollectProtocolFee. Não há instrução separada e nenhum contador separado para isso.
  • creator_fees_token_{0,1} são zerados, exatamente como antes.
Três propriedades que valem a pena confiar:
  • Arredondamento favorece o criador. A parcela do protocolo arredonda para baixo, então poeira fica com o criador — a mesma direção que protocol_fee e fund_fee, que também extraem uma parcela de uma taxa já acumulada.
  • Valor é conservado. creator_amount + shared_amount == creator_fee para cada taxa e cada taxa, incluindo u64::MAX.
  • share_rate = 0 é uma operação nula. Tanto o valor de configuração padrão quanto a ausência de um PDA CreatorFeeShare deixam toda a taxa do criador com o criador, que é o comportamento pré-atualização.

O que significa para integradores

  • LPs e cotação não são afetados. O valor compartilhado se move entre dois contadores que ambos já são excluídos da visão da curva do vault (vault_amount_without_fee), então curve_x e curve_y não se movem em uma coleta. k não é tocado.
  • Um estimador de taxa do criador que lê creator_fees_token* agora superestima o pagamento. Multiplique por (1 − share_rate / 1_000_000) usando a taxa que realmente se aplica a esse par (creator, amm_config), não o padrão de configuração.
  • protocol_fees_token* cresce fora de swaps. Um monitor que reconcilia acúmulo de protocolo contra volume de swap verá saltos em cada coleta de taxa do criador. O acúmulo de protocolo não é mais apenas trade_fee × protocol_fee_rate.
  • A taxa pode mudar entre acúmulo e coleta. É lida no momento da coleta, então taxas que se acumularam sob uma taxa liquidam com qualquer taxa que estiver em vigor quando alguém chamar Collect*.
A conta CreatorFeeShare é criada e fechada pelo admin ou uma autoridade dedicada de compartilhamento de taxa do criador através de CreateCreatorFeeShare / CloseCreatorFeeShare; fechá-la retorna o par a AmmConfig.creator_fee_share_rate. Layout da conta em products/cpmm/accounts, endereços em reference/program-addresses.

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 do criador, o signatário do criador é a conta registrada em PoolState. No caminho sem permissão, o chamador paga para criar qualquer ATA do 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, então o chamador não pode redirecionar fundos.

Alterando um nível de taxa

As taxas podem ser alteradas pelo admin via UpdateAmmConfig (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 AmmConfig para outro.
  • Reprojetar retroativamente taxas já acumuladas.
  • Coletar taxas sem o signatário protocol_owner / fund_owner.

Lendo taxas de um pool em execução

Resolva a taxa de compartilhamento on-chain, não a partir de uma configuração em cache. creator_fee_share_rate é um campo AmmConfig recém-adicionado, então leia-o da conta em vez de assumir que a carga útil de configuração REST o carrega, e verifique se um PDA CreatorFeeShare existe em ["creator_fee_share", creator, ammConfig] antes de citar um pagamento do criador. Um PDA ausente é o caso comum e significa que o padrão de configuração se aplica.

Comparação com CLMM e AMM v4

Veja reference/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 nenhuma 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 DecreaseLiquidity ou CollectFees.

Para onde ir a seguir

Fontes: