Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →

Résumé des instructions

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

Initialize

Crée un nouveau pool CPMM. Arguments
Comptes (W = inscriptible, S = signataire) * pool_state signe uniquement sur le chemin à 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 cas par cas.
  • creator a au moins init_amount_0 et init_amount_1 dans les ATA respectifs.
  • amm_config.disable_create_pool == false.
Conditions postérieures
  • 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 façon 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 une division 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 entraînent zéro LP en raison d’une différence de décimales.

Deposit

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

Withdraw

Brûle les tokens LP et reçoit 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
Conditions postérieures
  • 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 suit la direction de l’utilisateur, pas le token_0 / token_1 canonique du pool. Le programme détermine quel coffre correspond à quel en comparant 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 commerce s’arrondit à zéro.
  • NotApproved — le pool est en pause pour les swaps via UpdatePoolStatus.
  • InvalidInput — les mints ne correspondent à aucun des mints des coffres du pool.

SwapBaseOutput

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

CollectProtocolFee

Récupère les frais de protocole accumulés des coffres vers la destination du protocole. Arguments — aucun. Comptes Effet
Pas de changement aux balances effectives de la courbe (les frais accumulés étaient déjà exclus). Erreur couranteNotApproved si le signataire n’est pas protocol_owner.

CollectFundFee

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

CollectCreatorFee

Même structure à nouveau, signée par pool_state.pool_creator. Émet des transferts uniquement si le pool a été initialisé avec un taux de frais de créateur non nul.

UpdatePoolStatus

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

CreateAmmConfig

Crée une nouvelle tranche 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

Change les taux de frais ou la propriété sur une AmmConfig existante. Prend un param: u8 (discriminateur pour le champ à mettre à jour) et une value: u64. La sémantique des valeurs par paramètre se trouve dans le code source ; couramment :
  • param = 0trade_fee_rate
  • param = 1protocol_fee_rate
  • param = 2fund_fee_rate
  • param = 3new_protocol_owner (passe 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’administrateur et affectent tous les pools liés à cette AmmConfig lors du prochain swap. Pas de migration ; les pools lisent simplement les nouvelles valeurs.

Matrice de changements d’état

Où aller ensuite

Sources :