Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Deux frais indépendants, quatre destinations
CPMM prélève deux frais à taux distincts sur chaque swap :- Frais de trading — prélevés à
AmmConfig.trade_fee_rateet répartis entre trois destinations :- Part LP — reste dans le coffre et augmente
k. Réclamée implicitement en brûlant les tokens LP. - Part protocole — accumulée dans
PoolState.protocol_fees_token*; collectée par leprotocol_ownerviaCollectProtocolFee. - Part fonds — accumulée dans
PoolState.fund_fees_token*; collectée par lefund_ownerviaCollectFundFee.
- Part LP — reste dans le coffre et augmente
- Frais créateur (optionnel, par pool) — prélevés à
AmmConfig.creator_fee_rateindépendamment du frais de trading et accumulés dansPoolState.creator_fees_token*. Le créateur peut les collecter viaCollectCreatorFee, ou n’importe quel payeur peut déclencher le chemin contraintCollectCreatorFeePermissionless. Actif uniquement si le pool a été créé avecenable_creator_fee = true. Depuis la mise à jour du 2026-09-19, le frais créateur accumulé est à nouveau réparti au moment de la collecte : une part configurable est déplacée vers le bucket protocole du pool et seul le reste atteint le créateur — voir Part protocole du frais créateur.
trade_fee uniquement, jamais de creator_fee. Un pool avec creator_fee_rate = 1000 (0,10 %) et trade_fee_rate = 2500 (0,25 %) facture un total de 0,35 % de l’entrée sur un swap avec frais créateur sur l’entrée, dont le bucket créateur reçoit 0,10 % et le bucket frais de trading reçoit 0,25 %.
La part protocole du frais créateur fonctionne dans l’autre sens et est facile à confondre avec ce qui précède : elle est prélevée sur le bucket créateur, pas sur le frais de trading, et pas sur le swap — elle est appliquée quand CollectCreatorFee ou CollectCreatorFeePermissionless règle le solde accumulé. Les mathématiques du swap ne sont pas modifiées par cela.
Les taux de frais de trading (trade_fee_rate, protocol_fee_rate, fund_fee_rate), le creator_fee_rate et le creator_fee_share_rate par défaut vivent tous sur AmmConfig. Le drapeau enable_creator_fee par pool et le mode creator_fee_on (de quel côté du trade le frais créateur est prélevé) vivent sur PoolState. Un remplacement par créateur du taux de partage vit sur son propre PDA CreatorFeeShare. Voir products/cpmm/accounts.
Taux et unités
Tous les taux sont desu64 exprimés en unités de 1 / FEE_RATE_DENOMINATOR où FEE_RATE_DENOMINATOR = 1_000_000.
trade_fee_rateest une fraction du volume de swap.2500⇒ 0,25 % du côté pertinent (entrée ou sortie, seloncreator_fee_on— voir « De quel côté du trade les frais sont prélevés » ci-dessous).creator_fee_rateest une fraction du volume de swap, prélevée séparément du frais de trading.1000⇒ 0,10 % du côté pertinent.protocol_fee_rateetfund_fee_ratesont des fractions du frais de trading, pas du volume.120_000⇒ 12 % du frais de trading.creator_fee_share_rateest une fraction du frais créateur accumulé, pas du volume ni du frais de trading.200_000⇒ 20 % de ce qui se trouve danscreator_fees_token*au moment de sa collecte.0(la valeur par défaut) laisse tout le frais créateur au créateur.
AmmConfig[index=0] (le pool « standard » 0,25 %) sur mainnet, à titre de référence :
Donc sur un swap de $1 000 contre
AmmConfig[0] avec enable_creator_fee = false : $2,50 de frais de trading total, dont $2,10 restent avec les LP, $0,30 vont au protocole, $0,10 au fonds. Le bucket créateur est 0 car le frais créateur est désactivé.
Si le même pool avait enable_creator_fee = true et creator_fee_rate = 1000 (0,10 %), l’utilisateur paie un supplément de $1,00 au bucket créateur — prélevé du même côté du trade configuré par creator_fee_on — pour un total de $3,50 de frais. Le bucket frais de trading et ses répartitions protocole/fonds restent inchangés.
Confirmez les valeurs mainnet actuelles contre GET https://api-v3.raydium.io/main/cpmm-config — les taux sont mutables par l’admin et doivent être lus à frais plutôt que codés en dur.
La répartition, en code
- Le frais total sur l’entrée arrondit vers le haut pour que le pool ne sous-facture jamais.
- Les sous-répartitions de
trade_fee(protocole, fonds) arrondissent vers le bas pour que leur somme ne dépasse jamaistrade_fee; le reste est la part LP. lp_share = trade_fee − protocol_fee − fund_fee(creator_fee n’est pas soustrait ici car c’est son propre bucket).- Le frais créateur est prélevé sur l’entrée ou la sortie selon
PoolState.creator_fee_on(voir la section suivante). Le taux reste inchangé de toute façon.
De quel côté du trade les frais sont prélevés
CPMM a un paramètrecreator_fee_on par pool (BothToken / OnlyToken0 / OnlyToken1) qui détermine si le frais créateur est prélevé du côté entrée ou du côté sortie d’un swap donné. L’assistant d’exécution is_creator_fee_on_input(direction) réduit cela à un booléen par swap :
Quand le frais créateur est du côté entrée, à la fois le frais de trading et le frais créateur sont déduits de
amount_in avant que la courbe ne s’exécute. Mathématiques de devis : prélever le trade_rate + creator_rate combiné sur l’entrée.
Quand le frais créateur est du côté sortie, seul le frais de trading est déduit de amount_in ; la courbe produit une sortie sans frais, puis le frais créateur est déduit de cette sortie. Mathématiques de devis : prélever trade_rate sur l’entrée ; prélever creator_rate sur la sortie.
Le frais de trading lui-même est toujours prélevé du côté entrée (le modèle standard Uniswap-V2). Seul le frais créateur peut atterrir sur la sortie.
Comment les frais « accumulés » interagissent avec la courbe
Une subtilité importante : les frais protocole, fonds et créateur restent physiquement dans le coffre jusqu’à ce que leur instructionCollect* respective soit appelée. Mais ils sont exclus de la vue de la courbe du solde du coffre.
Une image concrète après un swap :
curve_x (et l’analogue curve_y) lors de l’application de k' ≥ k. C’est ainsi que les frais non-LP atteignent leurs destinations sans gonfler la part LP du pool.
Conséquences sur lesquelles vous devriez concevoir :
- Faire un devis sur les soldes bruts est faux. Si vous construisez un quoteur sur
getTokenAccountBalance, vous surévaluerez systématiquement le prix que le pool honorera. Soustrayez toujours les frais accumulés, ou simulez viaSwapBaseInput/ l’API. CollectProtocolFeene déplace pas le prix. Il déplace les tokens hors du coffre et met à zéro les compteursprotocol_fees_token*, donccurve_xetcurve_yrestent inchangés.- Les frais LP ne s’accumulent pas dans un compteur. Ils sont implicites dans le solde du coffre. Le droit des LP aux frais LP accumulés est exercé en brûlant les tokens LP (c.-à-d., via
Withdraw) — il n’y a pas deCollectLpFee.
Interaction avec les frais de transfert Token-2022
Les frais de transfert Token-2022 sont appliqués par le mint, pas par CPMM. Ils agissent sur chaque transfert de token — swap, dépôt, retrait, et les balayagesCollect*. Les mathématiques du frais de trading de CPMM sont calculées par rapport au montant qui a réellement atterri dans le coffre, c.-à-d., net du frais de transfert du mint d’entrée (le cas échéant).
Donc dans le pire des cas, un utilisateur paie trois taxes distinctes sur un swap d’entrée exacte :
- Le frais de transfert du mint d’entrée sur
amount_in(à l’autorité de frais du mint). - Le
trade_feedu pool sur le reste (réparti comme ci-dessus). - Le frais de transfert du mint de sortie sur
amount_out(à l’autorité de frais du mint).
minimum_amount_out est exprimé en ce que l’utilisateur reçoit réellement. Si vous écrivez votre propre quoteur, reflétez ce comportement, ou vos vérifications de slippage seront systématiquement trop généreuses.
Voir algorithms/token-2022-transfer-fees pour la dérivation détaillée.
Frais créateur
Le frais créateur est optionnel et par pool. Le taux vit surAmmConfig.creator_fee_rate ; le drapeau d’activation et le côté (creator_fee_on) vivent sur PoolState :
- Activé à la création du pool.
Initializedéfinitenable_creator_fee = falsepar défaut ; les pools créés viaInitializeWithPermission(utilisés par les graduations LaunchLab et autres chemins contrôlés) peuvent passerenable_creator_fee = trueet choisircreator_fee_on. - Le taux est partagé avec le niveau de frais. Le taux lui-même est
AmmConfig.creator_fee_rate, la même valeur sur chaque pool lié à cette config. Chaque pool décide alors s’il faut le facturer (enable_creator_fee) et de quel côté du swap le facturer (creator_fee_on). Quandenable_creator_fee = false, le taux de frais créateur effectif du pool est zéro indépendamment de la valeur de config (voirPoolState::adjust_creator_fee_ratedans la source). - Indépendant du frais de trading. Le frais créateur ne réduit jamais les parts LP / protocole / fonds — c’est son propre taux, appliqué séparément, accumulé dans ses propres compteurs.
- Collecté via
CollectCreatorFeeouCollectCreatorFeePermissionless. Le chemin original nécessite quePoolState.pool_creatorsigne. Le chemin sans permission permet à n’importe quel payeur de déclencher la collecte mais fixe les deux destinations aux ATA canoniques du créateur. Les deux chemins règlent d’abord la part du protocole — voir la section suivante. - Ne peut pas être réactivé ou réacheminer après la création. Un pool initialisé avec
enable_creator_fee = falsene facturera jamais de frais créateur ; un initialisé avec uncreator_fee_onparticulier ne peut pas changer de côté.
Part protocole du frais créateur
Depuis la mise à jour du 2026-09-19, le protocole peut conserver une part configurable du frais créateur. Rien ne change concernant le swap : le frais créateur est toujours facturé àcreator_fee_rate et s’accumule toujours en totalité dans creator_fees_token{0,1}. La répartition se produit une fois, au moment de la collecte, à l’intérieur de CollectCreatorFee et CollectCreatorFeePermissionless.
D’où vient le taux
Deux sources, par ordre de priorité :- PDA
CreatorFeeShare— seeds["creator_fee_share", creator, amm_config]. Quand ce compte existe et est possédé par CPMM, sonshare_rategagne. Cela permet au protocole de négocier un taux par créateur sur un niveau de frais donné sans toucher au niveau lui-même. AmmConfig.creator_fee_share_rate— la valeur par défaut pour chaque créateur sur ce niveau de frais. Utilisée chaque fois que le PDA n’existe pas.
u64 sur le même FEE_RATE_DENOMINATOR = 1_000_000, et les deux sont plafonnés au dénominateur. Les instructions de collecte prennent toujours le compte creator_fee_share, même quand il n’a jamais été créé — le programme vérifie s’il est vide et revient à la valeur par défaut. Passer la mauvaise adresse échoue la contrainte PDA, pas la valeur par défaut.
Ce que fait la répartition
creator_fees_token_0 et creator_fees_token_1, puis :
creator_amount_{0,1}est transféré hors des coffres vers les comptes de tokens du créateur.shared_amount_{0,1}est ajouté àprotocol_fees_token_{0,1}et reste dans le coffre jusqu’à ce que le propriétaire du protocole le balaye avecCollectProtocolFee. Il n’y a pas d’instruction séparée ni de compteur séparé pour cela.creator_fees_token_{0,1}sont mis à zéro, exactement comme avant.
- L’arrondi favorise le créateur. La part protocole arrondit vers le bas, donc la poussière reste avec le créateur — la même direction que
protocol_feeetfund_fee, qui carvent également une part d’un frais déjà accumulé. - La valeur est conservée.
creator_amount + shared_amount == creator_feepour chaque taux et chaque frais, y comprisu64::MAX. share_rate = 0est une no-op. À la fois la valeur de config par défaut et l’absence d’un PDACreatorFeeSharelaissent tout le frais créateur au créateur, ce qui est le comportement pré-mise à jour.
Ce que cela signifie pour les intégrateurs
- Les LP et les devis ne sont pas affectés. Le montant partagé se déplace entre deux compteurs qui sont tous les deux déjà exclus de la vue de la courbe du coffre (
vault_amount_without_fee), donccurve_xetcurve_yne bougent pas lors d’une collecte.kest inchangé. - Un estimateur de frais créateur qui lit
creator_fees_token*surévalue maintenant le paiement. Multipliez par(1 − share_rate / 1_000_000)en utilisant le taux qui s’applique réellement à cette paire(creator, amm_config), pas la valeur par défaut de config. protocol_fees_token*augmente en dehors des swaps. Un moniteur qui réconcilie l’accumulation du protocole par rapport au volume de swap verra des sauts à chaque collecte de frais créateur. L’accumulation du protocole n’est plustrade_fee × protocol_fee_rateseul.- Le taux peut changer entre l’accumulation et la collecte. Il est lu au moment de la collecte, donc les frais qui se sont accumulés sous un taux se règlent au taux qui est en vigueur quand quelqu’un appelle
Collect*.
CreatorFeeShare est créé et fermé par l’admin ou une autorité dédiée de partage de frais créateur via CreateCreatorFeeShare / CloseCreatorFeeShare ; le fermer retourne la paire à AmmConfig.creator_fee_share_rate. Disposition du compte dans products/cpmm/accounts, adresses dans reference/program-addresses.
Flux opérationnel de collecte
Les propriétaires du protocole et du fonds sont le multisig Raydium sur mainnet ; voir
security/admin-and-multisig. Sur le chemin original réservé au créateur, le signataire créateur est le compte enregistré dans PoolState. Sur le chemin sans permission, l’appelant paie pour créer l’ATA créateur manquant. Le programme contraint creator à pool_state.pool_creator et dérive chaque destination de ce créateur plus le mint du coffre correspondant et le programme de tokens, donc l’appelant ne peut pas rediriger les fonds.
Modification d’un niveau de frais
Les taux de frais peuvent être modifiés par l’admin viaUpdateAmmConfig (voir products/cpmm/instructions). Les modifications prennent effet au prochain swap pour chaque pool lié à cet AmmConfig — il n’y a pas de migration, car les pools chargent la config à chaque swap.
Ce que l’admin ne peut pas faire :
- Déplacer un pool d’un
AmmConfigà un autre. - Réévaluer rétroactivement les frais déjà accumulés.
- Collecter les frais sans le signataire
protocol_owner/fund_owner.
Lecture des frais d’un pool en cours d’exécution
Résolvez le taux de partage on-chain, pas à partir d’une config en cache.
creator_fee_share_rate est un champ AmmConfig nouvellement ajouté, donc lisez-le sur le compte plutôt que de supposer que la charge utile de config REST le porte, et vérifiez si un PDA CreatorFeeShare existe à ["creator_fee_share", creator, ammConfig] avant de citer un paiement créateur. Un PDA absent est le cas courant et signifie que la valeur par défaut de config s’applique.Comparaison avec CLMM et AMM v4
Voirreference/fee-comparison pour une matrice côte à côte. Résumé :
- AMM v4 utilise un frais de trading fixe de 0,25 % avec une répartition LP/protocole différente et pas de frais de fonds.
- CLMM les frais sont par niveau d’espacement de tick, accumulés par position (pas par pool), et réclamés via
DecreaseLiquidityouCollectFees.
Où aller ensuite
products/cpmm/math— où la déduction du frais de trading se branche dans la courbe.products/cpmm/instructions— les listes de comptes d’instructionCollect*, y compris le comptecreator_fee_shareque les deux chemins créateur nécessitent maintenant.algorithms/token-2022-transfer-fees— comment combiner correctement un frais de trading de pool avec un frais de transfert de mint.

