Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Cette page est la référence d’instruction faisant autorité. Pour le code qui compose réellement ces instructions, consultez products/cpmm/code-demos. Pour les significations des codes d’erreur, consultez reference/error-codes.

Résumé des instructions

Masque de statut : le status de chaque pool est un u8 où le bit 0 = dépôt désactivé, bit 1 = retrait désactivé, bit 2 = swap désactivé (PoolStatusBitIndex { Deposit, Withdraw, Swap } dans le programme). Un bit clair signifie que l’opération est autorisée ; un bit défini signifie qu’elle est en pause. UpdatePoolStatus prend un u8 brut et remplace la valeur existante. Les sections suivantes détaillent chacune. L’ordre des comptes suit l’IDL CPMM ; le SDK et le client Rust dans raydium-cp-swap/programs/cp-swap/src/instructions correspondent à cet ordre.

Initialize

Créer un nouveau pool CPMM. Arguments
Comptes (W = inscriptible, S = signataire) * pool_state signe uniquement sur le chemin de paire aléatoire ; le chemin PDA canonique s’exécute sans que pool_state signe. Conditions préalables
  • Les mints sont triés (token_0_mint < token_1_mint par ordre d’octets).
  • Aucun mint n’utilise d’extension en dehors de la liste d’autorisation CPMM (TransferFeeConfig, MetadataPointer, TokenMetadata, InterestBearingConfig, ScaledUiAmount) — voir products/cpmm/accounts. Une petite liste d’autorisation par mint à l’intérieur du programme contourne la vérification pour l’intégration au cas par cas.
  • creator a au moins init_amount_0 et init_amount_1 dans les ATA respectifs.
  • amm_config.disable_create_pool == false.
Postconditions
  • pool_state existe avec lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.
  • Le démarrage LP de LOCKED_LP (100 lamports de token LP) est verrouillé de manière permanente dans le pool — pool_state.lp_supply enregistre liquidity − 100 tandis que 100 unités LP restent hors circulation, empêchant le pool d’être complètement vidé et de diviser par zéro.
  • observation_state est initialisé ; observation_index = 0 et pool_id = pool_state.key().
  • Les lamports create_pool_fee sont transférés du créateur au destinataire et synchronisés en SOL natif (c’est un ATA wSOL).
  • Le masque de statut du pool est 0 (dépôt / retrait / swap tous activés).
  • enable_creator_fee = false et creator_fee_on = BothToken. Initialize ne supporte pas l’activation des frais de créateur — ce chemin est InitializeWithPermission.
  • open_time est augmenté à block_timestamp + 1 si l’appelant a passé une valeur <= block_timestamp. Les swaps sont rejetés avant open_time ; les dépôts et retraits fonctionnent immédiatement.
Erreurs courantes (liste complète dans reference/error-codes)
  • InvalidInput — mints non triés, ou mints identiques.
  • NotSupportMint — extension Token-2022 bloquée.
  • ExceededSlippage — rarement ; si init_amount_0/1 résultent en zéro LP en raison d’une inadéquation de décimales.

Deposit

Ajouter de la liquidité dans les deux tokens proportionnellement au pool. Arguments
Comptes Mathématiques
Aucun changement à la proportionnalité de k — les deux coffres et lp_supply se mettent à l’échelle par le même facteur. Postconditions
  • lp_supply += lp_token_amount.
  • vault_0 += needed_token_0 (net de tout frais de transfert Token-2022 sur l’entrée).
  • vault_1 += needed_token_1 (net de tout frais de transfert Token-2022 sur l’entrée).
Erreurs courantesExceededSlippage, ZeroTradingTokens, InvalidStatus si le dépôt est en pause.

Withdraw

Brûler les tokens LP et recevoir les deux tokens sous-jacents au prorata. Arguments
Comptes (Identique à Deposit ; lp_mint est inscriptible car les tokens LP sont brûlés.) Mathématiques
Postconditions
  • lp_supply -= lp_token_amount.
  • Les coffres envoient out_token_0 / out_token_1 (brut ; l’utilisateur reçoit net de tout frais de transfert Token-2022).

SwapBaseInput

Swap à entrée exacte. Arguments
Comptes L’ordre entrée → sortie est selon la direction de l’utilisateur, pas selon le token_0 / token_1 canonique du pool. Le programme détermine quel coffre est lequel en faisant correspondre les mints. Mathématiques — voir products/cpmm/math. Conditions préalables
  • open_time <= now.
  • pool_status autorise le swap.
  • Aucun mint en pause ou gelé pour cette autorité.
  • amount_in > 0.
Erreurs courantes
  • ExceededSlippageamount_out < minimum_amount_out.
  • ZeroTradingTokens — le trade s’arrondit à zéro.
  • NotApproved — le pool est en pause pour les swaps via UpdatePoolStatus.
  • InvalidInput — les mints ne correspondent à aucun des mints du coffre du pool.

SwapBaseOutput

Swap à sortie exacte. Arguments
Comptes — identiques à SwapBaseInput. Mathématiques — courbe inverse avec plafond, voir products/cpmm/math. Erreurs courantesExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.

CollectProtocolFee

Collecter les frais de protocole accumulés des coffres vers la destination du protocole. Arguments — aucun. Comptes Effet
Aucun changement aux soldes effectifs de la courbe (les frais accumulés étaient déjà exclus). Erreur couranteNotApproved si le signataire n’est pas protocol_owner.

CollectFundFee

Même forme que CollectProtocolFee mais signée par fund_owner et mettant à zéro les compteurs fund_fees_*.

CollectCreatorFee

Signé par pool_state.pool_creator. Il transfère les soldes complets creator_fees_token_0 et creator_fees_token_1 aux comptes de tokens du créateur, puis met à zéro les deux compteurs. Il retourne NoFeeCollect quand les deux compteurs sont à zéro.

CollectCreatorFeePermissionless

N’importe qui peut déclencher la collecte des frais de créateur. L’instruction envoie toujours les soldes accumulés complets aux comptes de tokens associés canoniques possédés par pool_state.pool_creator ; l’appelant ne peut pas choisir un autre créateur ou destination. Si l’un des ATA est manquant, le payeur finance sa création. L’original CollectCreatorFee reste appelable, donc les clients existants restent compatibles. Arguments — aucun. Comptes Effet
  • Transfère tout creator_fees_token_0 et creator_fees_token_1 des coffres du pool aux ATA du créateur.
  • Met à zéro les deux compteurs de frais de créateur et met à jour pool_state.recent_epoch.
  • Retourne NoFeeCollect quand les deux compteurs sont à zéro.

UpdatePoolStatus

Mettre en pause ou reprendre des opérations individuelles sur un pool. Le champ status est un masque de bits : Arguments
Comptes La clé admin est l’autorité de mise à niveau du programme CPMM — en pratique, le multisig Raydium. Voir security/admin-and-multisig.

CreateAmmConfig

Créer un nouveau palier de frais. Arguments
Comptes Conditions préalables
  • Aucune AmmConfig existante avec le même index.
  • protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.

UpdateAmmConfig

Modifier les taux de frais ou la propriété sur une AmmConfig existante. Prend un param: u8 (discriminateur pour quel champ mettre à jour) et une value: u64. La sémantique de la valeur par param est dans la source ; couramment :
  • param = 0trade_fee_rate
  • param = 1protocol_fee_rate
  • param = 2fund_fee_rate
  • param = 3new_protocol_owner (passer les octets Pubkey comme une réinterprétation)
  • param = 4new_fund_owner
  • param = 5create_pool_fee
  • param = 6disable_create_pool
Les modifications sont signées par l’admin et affectent chaque pool lié à cette AmmConfig au prochain swap. Pas de migration ; les pools lisent simplement les nouvelles valeurs.

Matrice de changement d’état

Où aller ensuite

Sources :