Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
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
* 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_mintpar ordre d’octets). - Aucun mint n’utilise d’extension en dehors de la liste d’autorisation CPMM (
TransferFeeConfig,MetadataPointer,TokenMetadata,InterestBearingConfig,ScaledUiAmount) — voirproducts/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. creatora au moinsinit_amount_0etinit_amount_1dans les ATA respectifs.amm_config.disable_create_pool == false.
pool_stateexiste aveclp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.- Le démarrage LP de
LOCKED_LP(100lamports de token LP) est verrouillé de manière permanente dans le pool —pool_state.lp_supplyenregistreliquidity − 100tandis que100unités LP restent hors circulation, empêchant le pool d’être complètement vidé et de diviser par zéro. observation_stateest initialisé ;observation_index = 0etpool_id = pool_state.key().- Les lamports
create_pool_feesont 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 = falseetcreator_fee_on = BothToken.Initializene supporte pas l’activation des frais de créateur — ce chemin estInitializeWithPermission.open_timeest augmenté àblock_timestamp + 1si l’appelant a passé une valeur<= block_timestamp. Les swaps sont rejetés avantopen_time; les dépôts et retraits fonctionnent immédiatement.
reference/error-codes)
InvalidInput— mints non triés, ou mints identiques.NotSupportMint— extension Token-2022 bloquée.ExceededSlippage— rarement ; siinit_amount_0/1ré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
Mathématiques
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).
ExceededSlippage, 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
(Identique à
Deposit ; lp_mint est inscriptible car les tokens LP sont brûlés.)
Mathématiques
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
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_statusautorise le swap.- Aucun mint en pause ou gelé pour cette autorité.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— le trade s’arrondit à zéro.NotApproved— le pool est en pause pour les swaps viaUpdatePoolStatus.InvalidInput— les mints ne correspondent à aucun des mints du coffre du pool.
SwapBaseOutput
Swap à sortie exacte.
Arguments
SwapBaseInput.
Mathématiques — courbe inverse avec plafond, voir products/cpmm/math.
Erreurs courantes — ExceededSlippage (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
NotApproved 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_0etcreator_fees_token_1des 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
NoFeeCollectquand 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
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
Conditions préalables
- Aucune
AmmConfigexistante avec le mêmeindex. 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 = 0→trade_fee_rateparam = 1→protocol_fee_rateparam = 2→fund_fee_rateparam = 3→new_protocol_owner(passer les octetsPubkeycomme une réinterprétation)param = 4→new_fund_ownerparam = 5→create_pool_feeparam = 6→disable_create_pool
AmmConfig au prochain swap. Pas de migration ; les pools lisent simplement les nouvelles valeurs.
Matrice de changement d’état
Où aller ensuite
products/cpmm/code-demos— exemples TypeScript exécutables pour ce qui précède.reference/error-codes— la table d’erreur Anchor complète.products/cpmm/fees— le modèle d’accumulation de frais que les instructionsCollect*Feedrainent.

