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 vault 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 vault 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 cheminCollectCreatorFeePermissionlessavec destinations contraintes. Actif uniquement si le pool a été créé avecenable_creator_fee = true.
trade_fee uniquement, jamais de creator_fee. Un pool avec creator_fee_rate = 1000 (0,10 %) et trade_fee_rate = 2500 (0,25 %) prélève un total de 0,35 % de l’input sur un swap avec frais créateur sur input, dont le créateur garde les 0,10 % et le bucket frais de trading reçoit les 0,25 %.
Les taux de frais de trading (trade_fee_rate, protocol_fee_rate, fund_fee_rate) et le creator_fee_rate se trouvent 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é) se trouvent sur PoolState. 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 (input ou output, 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, non du volume.120_000⇒ 12 % du frais de trading.
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 input 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 input ou output selon
PoolState.creator_fee_on(voir 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é input ou output d’un swap donné. L’aide runtime is_creator_fee_on_input(direction) réduit cela à un booléen par swap :
Quand le frais créateur est du côté input, à 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’input.
Quand le frais créateur est du côté output, seul le frais de trading est déduit de amount_in ; la courbe produit un output sans frais, puis le frais créateur est déduit de cet output. Mathématiques de devis : prélever trade_rate sur l’input ; prélever creator_rate sur l’output.
Le frais de trading lui-même est toujours prélevé du côté input (le modèle standard Uniswap-V2). Seul le frais créateur peut atterrir sur output.
Comment les frais « accumulés » interagissent avec la courbe
Une subtilité importante : les frais protocole, fonds et créateur restent physiquement dans le vault jusqu’à ce que leur instructionCollect* respective soit appelée. Mais ils sont exclus de la vue de la courbe du solde du vault.
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 que vous devriez concevoir autour :
- Citer hors des soldes bruts est faux. Si vous construisez un quoteur hors de
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 vault 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 vault. 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, non par CPMM. Ils agissent sur chaque transfert de token — swap, dépôt, retrait, et les balayagesCollect*. Les mathématiques de frais de trading de CPMM sont calculées contre le montant qui a réellement atterri dans le vault, c.-à-d., net du frais de transfert du mint d’input (le cas échéant).
Donc dans le pire des cas, un utilisateur paie trois taxes distinctes sur un swap input-exact :
- Le frais de transfert du mint d’input 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 d’output 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 se trouve surAmmConfig.creator_fee_rate ; le drapeau d’activation et le côté (creator_fee_on) se trouvent 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.
- Balayé via
CollectCreatorFeeouCollectCreatorFeePermissionless. Le chemin original nécessite quePoolState.pool_creatorsigne. Le chemin sans permission permet à n’importe quel payeur de déclencher la collection mais fixe les deux destinations aux ATA canoniques du créateur. - Ne peut pas être réactivé ou réacheminé après la création. Un pool initialisé avec
enable_creator_fee = falsene facturera jamais un frais créateur ; un initialisé avec uncreator_fee_onparticulier ne peut pas changer de côté.
Flux opérationnel de collection
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 vault correspondant et le programme de token, 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étroactivement réévaluer 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
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 (non 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*.algorithms/token-2022-transfer-fees— comment combiner correctement un frais de trading de pool avec un frais de transfert de mint.

