Passer au contenu principal

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Raydium n’accepte pas les mints Token-2022 arbitraires. CPMM et CLMM fonctionnent tous deux en mode liste blanche stricte : seul un petit ensemble d’extensions passe par défaut ; tout le reste est rejeté à la création du pool. Une poignée de mints de confiance sont admis par adresse codée en dur ; CLMM supporte en outre un registre par mint géré par un administrateur et une détection Superstate à l’exécution. Cette page est la référence unique pour ce qui est appliqué et où, avec des citations fichier-et-ligne dans le code source du programme.

Support au niveau du programme

ProgrammeMints base/quote Token-2022 ?Mode
CPMMOui — contrôléListe blanche stricte d’extensions + liste blanche statique de 4 mints.
CLMMOui — contrôléListe blanche stricte d’extensions + liste blanche statique de 6 mints + registre par mint admin + détection Superstate.
AMM v4NonLe programme antécède Token-2022 ; les deux mints doivent être du Token SPL classique.
Stable AMMNonMêmes contraintes que AMM v4.
Farm v6Oui, partielLe mint de récompense peut être Token-2022 (soumis à la même liste blanche quand une farm enveloppe un LP CPMM/CLMM) ; les mints LP de stake des utilisateurs héritent du pool enveloppé.
LaunchLabOui, géré par programmeLe mint de base peut être Token-2022, mais seulement via l’instruction dédiée initialize_with_token_2022 ; le programme crée lui-même le mint avec MetadataPointer (toujours) et optionnellement TransferFeeConfig (taux ≤ 5 %). Les mints Token-2022 pré-existants avec extensions arbitraires ne peuvent pas être utilisés comme base.
Burn & EarnMiroir du programme de poolHérite du contrôle CPMM / CLMM.
Les vérifications de liste blanche se trouvent dans : Il n’y a pas de vérification de mint au moment du swap sur CPMM ou CLMM — le portail se déclenche uniquement à la création du pool. Une fois qu’un pool existe, les swaps font simplement confiance au fait que les mints n’ont pas changé, ce qui est correct pour les parties immuables de l’état du mint Token-2022.

Liste blanche d’extensions CPMM et CLMM

Après les courts-circuits de liste blanche statique (couverts ci-dessous), le programme itère les extensions du mint et rejette le mint s’il porte une extension autre que ces cinq :
ExtensionRaison pour laquelle c’est autorisé
TransferFeeConfigLes mathématiques du pool soustraient la commission entrante ; le programme Token-2022 traite la commission sortante. Voir algorithms/token-2022-transfer-fees.
MetadataPointerDécorateur — pointe vers des métadonnées on-chain.
TokenMetadataDécorateur — métadonnées en ligne.
InterestBearingConfigLe pool voit le montant principal ; le multiplicateur UI est un décorateur et le solde sous-jacent est préservé.
ScaledUiAmountMême forme que l’intérêt composé — le facteur d’échelle s’applique uniquement à l’affichage UI.
Tout ce qui n’est pas dans cette liste — TransferHook, NonTransferable, ConfidentialTransferMint, PermanentDelegate, MintCloseAuthority, DefaultAccountState, GroupPointer, GroupMemberPointer, MemberPointer, Pausable, etc. — fait que is_supported_mint retourne false et la création du pool s’annule. Les lignes pertinentes (CPMM, forme identique dans CLMM) :
for e in extensions {
    if e != ExtensionType::TransferFeeConfig
        && e != ExtensionType::MetadataPointer
        && e != ExtensionType::TokenMetadata
        && e != ExtensionType::InterestBearingConfig
        && e != ExtensionType::ScaledUiAmount
    {
        return Ok(false);
    }
}
Ok(true)
cp-swap/src/utils/token.rs:190–200

Chemins de contournement

Un mint Token-2022 qui ne correspond pas à la liste blanche peut quand même être admis par l’un des trois contournements explicites. Ils sont tentés dans l’ordre, avant que l’itération d’extension ne s’exécute.

1. Liste blanche de mint statique

Un tableau constant MINT_WHITELIST de chaînes base58 est codé en dur dans chaque programme. Si l’adresse du mint correspond, la fonction retourne true immédiatement et aucune vérification d’extension n’est effectuée.
ProgrammeMints en liste blanche
CPMMHVbpJAQGNpkgBaYBZQBR1t7yFdvaYVp2vCQQfKKEN4tM, Crn4x1Y2HUKko7ox2EZMT6N2t2ZyH7eKtwkBGVnhEq1g, FrBfWJ4qE5sCzKm3k3JaAtqZcXUh4LvJygDeketsrsH4, 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
CLMMLes quatre mêmes, plus DAUcJBg4jSpVoEzASxYzdqHMUN8vuTpQyG2TvDcCHfZg, AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9
Ces adresses sont intégrées au programme ; la mise à jour de la liste nécessite une mise à niveau du programme via le multisig de mise à niveau 3/4.

2. Registre par mint — CLMM uniquement

CLMM consulte en outre un PDA SupportMintAssociated à la graine [b"support_mint", mint]. Si ce PDA existe pour le mint, il est admis indépendamment de son ensemble d’extensions. Le PDA est créé par CreateSupportMintAssociated (admin/create_support_mint_associated.rs). L’instruction est contrôlée à deux signataires :
  • crate::admin::ID — l’autorité admin Raydium standard.
  • crate::create_support_mint_associated_owner::ID — une autorité dédiée à cet effet : RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY (mainnet), rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5 (devnet).
Effet : l’équipe CLMM peut inscrire un mint Token-2022 spécifique à la création de pool sans mise à niveau du programme. CPMM n’a pas d’équivalent — sa liste blanche est strictement codée dans la source.

3. Détection Superstate — CLMM uniquement

CLMM a un troisième chemin spécifiquement pour les actifs tokenisés de Superstate, qui utilisent l’extension ScaledUiConfig que la version de spl-token-2022 liée au programme CLMM ne peut pas décompacter. Plutôt que de mettre à niveau la dépendance, CLMM détecte les tokens Superstate par la forme de leur autorité :
superstate_allowlist::ID == freeze_authority
    && *mint_account_info.owner == spl_token_2022::ID
    && default_account_state_freeze
    && maybe_permanent_delegate
raydium-clmm/programs/amm/src/util/token.rs:485 Un mint passe cette branche si les quatre tiennent :
  • Son programme propriétaire est le programme Token-2022.
  • Son autorité de gel égale superstate_allowlist::ID. Mainnet : 2Yq4T3mPNfjtEyTxSbRjRKqLf1pwbTasuCQrWe6QpM7x. Devnet : 3TRuL3MFvzHaUfQAb6EsSAbQhWdhmYrKxEiViVkdQfXu.
  • Son extension DefaultAccountState est définie sur Frozen.
  • Son délégué permanent est aussi superstate_allowlist::ID.
C’est une heuristique, pas un registre — tout mint futur que Superstate émettra avec la même forme d’autorité sera admis automatiquement.

Ce que les contournements ne dispensent pas

Les contournements ignorent la liste blanche d’extensions, mais le programme applique toujours :
  • Le mint est propriété de Token ou Token-2022. Un programme de token personnalisé est rejeté en amont.
  • Les coffres du pool sont créés avec les bonnes extensions ATA pour les pools Token-2022 (ImmutableOwner, etc.).
  • Tous les transferts passent par transfer_checked — les mints porteurs de frais landent le bon montant dans le coffre.
Un mint en liste blanche ou enregistré par PDA qui ajoute un TransferHook plus tard ne gagne pas une vérification au moment du swap ; le hook s’exécuterait simplement à chaque transfert et pourrait bloquer les swaps. La mise en liste blanche est donc une action de haute confiance.

Sémantique « Bloqué »

Quand is_supported_mint retourne false, la création du pool s’annule avec ErrorCode::NotSupportMint (CPMM) / ErrorCode::NotSupportMint (CLMM). Voir reference/error-codes pour les codes numériques. Les pools existants ne peuvent pas échouer rétroactivement cette vérification — le portail ne s’exécute qu’à la création. Les extensions de mint sont immuables pour les catégories que Raydium rejette (transfer hook, non-transférable, transfer confidentiel ne peut pas être ajouté post-création), donc la vérification statique est suffisante.

Pourquoi chaque extension exclue est exclue

  • TransferHook — invoque un programme personnalisé à chaque transfert, avec consommation CU arbitraire, conditions d’échec arbitraires, et la capacité à réentrer le programme appelant. Aucun sandbox sûr n’existe. Certains DEX maintiennent des listes blanches de hooks ; Raydium ne le fait pas.
  • NonTransferableTransfer échoue toujours. Un pool ne peut pas prendre la garde.
  • ConfidentialTransfer — les montants de transfert sont chiffrés ; la courbe ne peut pas évaluer le swap.
  • PermanentDelegate — un titulaire du délégué peut balayer n’importe quel compte de token, y compris le coffre du pool. Autorisé uniquement via la liste blanche statique pour les émetteurs de confiance (p. ex., stablecoins réglementés).
  • MintCloseAuthority — le mint peut être fermé ; les pools existants deviennent inutilisables. Disallowed by default.
  • DefaultAccountState (Frozen) — les ATA du pool se retrouveraient à l’état Frozen et nécessiteraient un dégel par compte. Autorisé uniquement via la détection Superstate, qui suppose que l’émetteur dégèle les comptes institutionnels lors de l’inscription.
  • Group/Member pointers — pas activement nuisibles, mais non examinés. Disallowed by default to keep the surface narrow.

Comptabilité des frais de transfert

Pour les mints portant TransferFeeConfig, chaque swap, dépôt et retrait déplace moins que le montant nominal. Le SDK expose les deux moitiés du calcul :
const { amountIn, amountOut, feeAmount, token2022FeeIn, token2022FeeOut } =
  await raydium.cpmm.computeSwapAmount({ ... });
Une UI correcte affiche :
  • amountIn + token2022FeeIn comme « vous envoyez »
  • amountOut - token2022FeeOut comme « vous recevez »
  • feeAmount comme la commission du pool (LP + protocole), qui est séparée de la commission de transfert Token-2022
Une UI naïve qui affiche uniquement amountIn → amountOut sous-estime les coûts.

Plafond maximumFee

Les frais de transfert Token-2022 sont plafonné par transfert. Pour un mint à 1 % avec un plafond de 10 000 tokens, un transfert de 100 000 000 tokens ne paie que 10 000 en frais. Le computeSwapAmount du SDK applique le plafond ; les appelants de programme directs doivent le reproduire.

Transition d’époque

Une autorité de mint peut programmer un changement de taux de frais qui s’active à l’époque suivante. Pendant la fenêtre de transition, deux configs (older, newer) vivent sur le mint à la fois et TransferChecked sélectionne par époque actuelle. SwapV2 de CPMM et SwapV2 de CLMM passent tous deux le compte de mint complet dans accounts, donc le programme lit la bonne config sans recherche supplémentaire. Si vous cotez plus d’une époque à l’avance via l’API Trade ou le SDK, les frais exécutés peuvent différer des frais cotés — délimité par maximum_fee_basis_points de la config la plus ancienne.

Interest-bearing et ScaledUiAmount

Le pool détient le montant principal ; le « montant UI » est le principal multiplié par un facteur d’échelle dépendant du temps ou défini par un administrateur. Les mathématiques du swap opèrent sur le principal :
principal_in = ui_amount_in / ui_multiplier(now)
Le SDK convertit automatiquement. Les lecteurs RPC directs doivent traiter pool.token0Vault.amount comme principal.

Définition de « pool Token-2022 »

Un pool est un pool Token-2022 si l’un ou l’autre mint a programId == TokenzQdB.... L’API expose ceci :
GET /pools/info/ids?ids=<POOL_ID>
{
  "data": [{
    "mintA": { "programId": "TokenzQdB...", "hasTransferFee": true, ... },
    "mintB": { "programId": "Tokenkeg...", ... }
  }]
}
Utilisez programId pour dispatcher, et hasTransferFee pour afficher un avertissement UI.

Aides du SDK

import { Raydium, TOKEN_2022_PROGRAM_ID } from "@raydium-io/raydium-sdk-v2";
import { ExtensionType, getExtensionTypes, unpackMint } from "@solana/spl-token";

const raydium = await Raydium.load({ owner, connection });

const acct = await connection.getAccountInfo(mintPubkey);
if (!acct) throw new Error("mint not found");
const mint = unpackMint(mintPubkey, acct, acct.owner);

if (acct.owner.equals(TOKEN_2022_PROGRAM_ID)) {
  const extensions = getExtensionTypes(mint.tlvData);
  const accepted = new Set([
    ExtensionType.TransferFeeConfig,
    ExtensionType.MetadataPointer,
    ExtensionType.TokenMetadata,
    ExtensionType.InterestBearingConfig,
    ExtensionType.ScaledUiAmount,
  ]);
  const rejecting = extensions.filter(e => !accepted.has(e));
  if (rejecting.length) {
    console.warn("Pool creation will revert unless this mint is whitelisted:", rejecting);
  }
}

Erreurs d’intégration courantes

  • Pré-validation seulement de l’ID du programme. Un mint peut être Token-2022 et non supporté. Marchez la liste d’extension par rapport à la liste blanche (et la liste blanche statique) avant d’autoriser la création du pool.
  • Faire confiance à la cotation du SDK quand le mint n’est pas accepté du tout. L’API de cotation ne refuse pas de coter — la création du pool est ce qui s’annule. Confirmez la sémantique is_supported_mint hors chaîne avant d’exposer la création du pool dans votre UI.
  • Coter sans la retenue de frais de transfert. Un mint à frais de transfert de 1 % des deux côtés d’un pool CPMM à 0,25 % a une commission effective d’environ 2,25 %, pas 0,25 %. Utilisez la cotation du SDK ou la cotation de l’API Trade — ne calculez jamais les frais manuellement à partir du seul niveau de frais du pool.
  • Appeler l’instruction Swap héritée sur un pool Token-2022. Swap antécède Token-2022. Utilisez SwapV2 quand l’un ou l’autre mint est Token-2022.
  • Lister automatiquement les nouveaux mints Token-2022. Les portefeuilles et agrégateurs doivent vérifier TransferHook et NonTransferable avant de surfacer un mint aux utilisateurs ; les deux sont hostiles à Raydium.

Travaux futurs

Les éléments de feuille de route d’écosystème Solana et de protocole qui changeraient cette matrice :
  • Programmes de transfer-hook en liste blanche au niveau Solana (convention d’écosystème en évolution).
  • AMM compatibles avec confidential-transfer (stade de recherche).
  • Registre par mint CPMM plus large (parité avec CLMM).
  • Mise à niveau de dépendance afin que le décodage ScaledUiConfig de CLMM fonctionne sans l’heuristique Superstate.
Cette page sera mise à jour quand l’une d’elles aboutira.

Pointeurs

Sources :
  • raydium-cp-swap/programs/cp-swap/src/utils/token.rsMINT_WHITELIST, is_supported_mint.
  • raydium-clmm/programs/amm/src/util/token.rsMINT_WHITELIST, superstate_allowlist, is_superstate_token, is_supported_mint.
  • raydium-clmm/programs/amm/src/instructions/admin/create_support_mint_associated.rs — instruction de registre par mint.
  • raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs — création de mint de base Token-2022 pour LaunchLab.