Skip to main content
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 :
  1. Frais de trading — prélevés à AmmConfig.trade_fee_rate et 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 le protocol_owner via CollectProtocolFee.
    • Part fonds — accumulée dans PoolState.fund_fees_token* ; collectée par le fund_owner via CollectFundFee.
  2. Frais créateur (optionnel, par pool) — prélevés à AmmConfig.creator_fee_rate indépendamment du frais de trading et accumulés dans PoolState.creator_fees_token*. Le créateur peut les collecter via CollectCreatorFee, ou n’importe quel payeur peut déclencher le chemin CollectCreatorFeePermissionless avec destinations contraintes. Actif uniquement si le pool a été créé avec enable_creator_fee = true.
Le frais créateur n’est pas une part du frais de trading. Les deux taux s’ajoutent lors du prélèvement sur l’input du swap, mais chacun reste son propre bucket — les parts protocole et fonds sont toujours dérivées de 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 des u64 exprimés en unités de 1 / FEE_RATE_DENOMINATORFEE_RATE_DENOMINATOR = 1_000_000.
  • trade_fee_rate est une fraction du volume de swap. 2500 ⇒ 0,25 % du côté pertinent (input ou output, selon creator_fee_on — voir « De quel côté du trade les frais sont prélevés » ci-dessous).
  • creator_fee_rate est 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_rate et fund_fee_rate sont des fractions du frais de trading, non du volume. 120_000 ⇒ 12 % du frais de trading.
Paramètres par défaut pour 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

Notes :
  • 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 jamais trade_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ètre creator_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 instruction Collect* 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 :
Le programme utilise 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 via SwapBaseInput / l’API.
  • CollectProtocolFee ne déplace pas le prix. Il déplace les tokens hors du vault et met à zéro les compteurs protocol_fees_token*, donc curve_x et curve_y restent 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 de CollectLpFee.

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 balayages Collect*. 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 :
  1. Le frais de transfert du mint d’input sur amount_in (à l’autorité de frais du mint).
  2. Le trade_fee du pool sur le reste (réparti comme ci-dessus).
  3. Le frais de transfert du mint d’output sur amount_out (à l’autorité de frais du mint).
Le quoteur du SDK tient compte des trois, donc 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 sur AmmConfig.creator_fee_rate ; le drapeau d’activation et le côté (creator_fee_on) se trouvent sur PoolState :
  • Activé à la création du pool. Initialize définit enable_creator_fee = false par défaut ; les pools créés via InitializeWithPermission (utilisés par les graduations LaunchLab et autres chemins contrôlés) peuvent passer enable_creator_fee = true et choisir creator_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). Quand enable_creator_fee = false, le taux de frais créateur effectif du pool est zéro indépendamment de la valeur de config (voir PoolState::adjust_creator_fee_rate dans 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 CollectCreatorFee ou CollectCreatorFeePermissionless. Le chemin original nécessite que PoolState.pool_creator signe. 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 = false ne facturera jamais un frais créateur ; un initialisé avec un creator_fee_on particulier ne peut pas changer de côté.
Les frais créateurs sont le mécanisme derrière le modèle « Burn & Earn » de Raydium : les tokens LP sont verrouillés sous le programme LP Lock pour que le créateur ne puisse pas retirer la liquidité, mais les frais créateurs accumulés peuvent toujours être collectés indéfiniment.

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 via UpdateAmmConfig (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

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

Où aller ensuite

Sources :