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:
    • 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 pelo protocol_owner via CollectProtocolFee.
    • Participação do fundo — acumulada em PoolState.fund_fees_token*; coletada pelo fund_owner via CollectFundFee.
  2. Taxa de 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 através de CollectCreatorFee, ou qualquer pagador pode disparar o caminho restrito a destino CollectCreatorFeePermissionless. Ativa apenas quando o pool foi criado com enable_creator_fee = true.
A taxa de 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 participações do protocolo e do fundo são sempre 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 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ã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.
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 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

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 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ção creator_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çã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 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 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 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 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 com 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ê 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 em AmmConfig.creator_fee_rate; o sinalizador 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 controlados) 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 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). 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 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 CollectCreatorFee ou CollectCreatorFeePermissionless. O caminho original requer que PoolState.pool_creator assine. 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 = false nunca cobrará uma taxa de criador; um inicializado com um creator_fee_on particular não pode mudar de lado.
As taxas de criador são o mecanismo por trás do padrão “Burn & Earn” do Raydium: tokens LP são bloqueados sob o programa LP Lock para que o criador não possa sacar liquidez, mas as taxas de criador acumuladas ainda podem ser coletadas indefinidamente.

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 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 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

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 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 DecreaseLiquidity ou CollectFees.

Próximos passos

Fontes: