Saltar al contenido 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.

Esta página fue traducida automáticamente por IA. La versión en inglés es la fuente autorizada.Ver versión en inglés →
Raydium no acepta mints arbitrarios de Token-2022. Tanto CPMM como CLMM funcionan en modo de lista blanca estricta: solo un pequeño conjunto de extensiones pasan por defecto; todo lo demás se rechaza en la creación del pool. Un puñado de mints de confianza se admiten por dirección codificada; CLMM además soporta un registro por mint administrado y detección de tokens Superstate en tiempo de ejecución. Esta página es la referencia única para lo que se aplica y dónde, con citas de archivo y línea en el código fuente del programa.

Soporte a nivel de programa

Programa¿Mints base/quote de Token-2022?Modo
CPMMSí — controladoLista blanca estricta de extensiones + lista blanca estática de 4 mints.
CLMMSí — controladoLista blanca estricta de extensiones + lista blanca estática de 6 mints + registro por mint del admin + detección Superstate.
AMM v4NoEl programa es anterior a Token-2022; ambos mints deben ser Token SPL clásico.
Stable AMMNoLas mismas restricciones que AMM v4.
Farm v6Sí, parcialEl mint de recompensa puede ser Token-2022 (sujeto a la misma lista blanca cuando una farm envuelve un LP de CPMM/CLMM); los mints de LP de stake del usuario heredan del pool envuelto.
LaunchLabSí, administrado por programaEl mint base puede ser Token-2022, pero solo mediante la instrucción dedicada initialize_with_token_2022; el programa mismo crea el mint con MetadataPointer (siempre) y opcionalmente TransferFeeConfig (tasa ≤ 5%). Los mints Token-2022 preexistentes con extensiones arbitrarias no se pueden usar como base.
Burn & EarnRefleja el programa del poolHereda el control de CPMM / CLMM.
Las verificaciones de la lista blanca viven en: No hay verificación de mint en tiempo de swap en CPMM o CLMM — la puerta se activa solo en la creación del pool. Una vez que un pool existe, los swaps simplemente confían en que los mints no cambien, lo cual es correcto para las partes inmutables del estado del mint de Token-2022.

Lista blanca de extensiones de CPMM y CLMM

Después de que los cortocircuitos de lista blanca estática (cubiertos más abajo), el programa itera las extensiones del mint y rechaza el mint si contiene cualquier extensión que no sea estas cinco:
ExtensiónRazón por la que se permite
TransferFeeConfigLas matemáticas del pool restan la tarifa de entrada; el programa Token-2022 maneja la tarifa de salida. Ver algorithms/token-2022-transfer-fees.
MetadataPointerDecorativa — apunta a metadatos en cadena.
TokenMetadataDecorativa — metadatos en línea.
InterestBearingConfigEl pool ve la cantidad principal; el multiplicador de UI es solo decorativo y el balance subyacente se preserva.
ScaledUiAmountLa misma forma que interest-bearing — el factor de escala se aplica solo a la pantalla de UI.
Cualquier cosa no en esta lista — TransferHook, NonTransferable, ConfidentialTransferMint, PermanentDelegate, MintCloseAuthority, DefaultAccountState, GroupPointer, GroupMemberPointer, MemberPointer, Pausable, etc. — hace que is_supported_mint devuelva false y la creación del pool se revierta. Las líneas relevantes (CPMM, forma idéntica en 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

Rutas de bypass

Un mint de Token-2022 que no se ajusta a la lista blanca aún puede ser admitido a través de uno de tres bypasses explícitos. Se intentan en orden, antes de que se ejecute la iteración de extensiones.

1. Lista blanca estática de mints

Un array constante MINT_WHITELIST de strings en base58 se codifica en cada programa. Si la dirección del mint coincide, la función devuelve true inmediatamente y no se realiza ninguna verificación de extensión.
ProgramaMints en la lista blanca
CPMMHVbpJAQGNpkgBaYBZQBR1t7yFdvaYVp2vCQQfKKEN4tM, Crn4x1Y2HUKko7ox2EZMT6N2t2ZyH7eKtwkBGVnhEq1g, FrBfWJ4qE5sCzKm3k3JaAtqZcXUh4LvJygDeketsrsH4, 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
CLMMLos mismos cuatro, más DAUcJBg4jSpVoEzASxYzdqHMUN8vuTpQyG2TvDcCHfZg, AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9
Estas direcciones se integran en el programa; actualizar la lista requiere una actualización del programa a través del multisig de actualización 3 de 4.

2. Registro por mint — solo CLMM

CLMM además consulta un PDA SupportMintAssociated con seed [b"support_mint", mint]. Si ese PDA existe para el mint, se admite independientemente de su conjunto de extensiones. El PDA se crea por CreateSupportMintAssociated (admin/create_support_mint_associated.rs). La instrucción se controla a dos firmantes:
  • crate::admin::ID — la autoridad estándar del admin de Raydium.
  • crate::create_support_mint_associated_owner::ID — una autoridad dedicada para este propósito: RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY (mainnet), rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5 (devnet).
Efecto: el equipo de CLMM puede optar un mint específico de Token-2022 para la creación del pool sin una actualización del programa. CPMM no tiene equivalente — su lista blanca es estrictamente código fuente.

3. Detección Superstate — solo CLMM

CLMM tiene una tercera ruta específicamente para activos tokenizados de Superstate, que usan la extensión ScaledUiConfig que la versión de spl-token-2022 vinculada al programa CLMM no puede desempaquetar. En lugar de actualizar la dependencia, CLMM detecta tokens Superstate por su forma de autoridad:
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 pasa esta rama si todos cuatro se cumplen:
  • Su programa propietario es el programa Token-2022.
  • Su autoridad de congelación es igual a superstate_allowlist::ID. Mainnet: 2Yq4T3mPNfjtEyTxSbRjRKqLf1pwbTasuCQrWe6QpM7x. Devnet: 3TRuL3MFvzHaUfQAb6EsSAbQhWdhmYrKxEiViVkdQfXu.
  • Su extensión DefaultAccountState está configurada en Frozen.
  • Su delegado permanente es también superstate_allowlist::ID.
Esta es una heurística, no un registro — cualquier mint futuro que Superstate emita con la misma forma de autoridad será admitido automáticamente.

Lo que los bypasses no eximen

Los bypasses omiten la lista blanca de extensiones, pero el programa aún aplica:
  • El mint es propiedad de Token o Token-2022. Un programa de token personalizado se rechaza anteriormente.
  • Los vaults del pool se crean con las extensiones ATA correctas para pools de Token-2022 (ImmutableOwner, etc.).
  • Todas las transferencias pasan por transfer_checked — los mints con tarifa colocan la cantidad correcta en el vault.
Un mint en lista blanca o registrado en PDA que, p. ej., agrega un TransferHook más tarde no obtiene una verificación en tiempo de swap; el hook simplemente se ejecutaría en cada transferencia y podría bloquear los swaps. Por lo tanto, la inclusión en la lista blanca es una acción de alto nivel de confianza.

Semántica de “bloqueado”

Cuando is_supported_mint devuelve false, la creación del pool se revierte con ErrorCode::NotSupportMint (CPMM) / ErrorCode::NotSupportMint (CLMM). Ver reference/error-codes para los códigos numéricos. Los pools existentes no pueden fallar retroactivamente en esta verificación — la puerta se ejecuta solo en la creación. Las extensiones de mint son inmutables para las categorías que Raydium rechaza (transfer hook, non-transferable, confidential transfer no se pueden agregar post-creación), por lo que la verificación estática es suficiente.

Por qué se excluye cada extensión

  • TransferHook — invoca un programa personalizado en cada transferencia, con consumo de CU arbitrario, condiciones de fallo arbitrarias, y la capacidad de reentrar al programa que llama. No existe sandbox seguro. Algunos DEXes mantienen listas blancas de hooks; Raydium no.
  • NonTransferableTransfer siempre falla. Un pool no puede tomar custodia.
  • ConfidentialTransfer — los montos de transferencia están cifrados; la curva no puede fijar el precio del swap.
  • PermanentDelegate — un titular del delegado puede barrer cualquier cuenta de token, incluido el vault del pool. Permitido solo mediante la lista blanca estática para emisores de confianza (p. ej., monedas estables reguladas).
  • MintCloseAuthority — el mint puede cerrarse; los pools existentes se vuelven inutilizables. Desallowado por defecto.
  • DefaultAccountState (Frozen) — los ATAs del pool aterrizarían en estado Frozen y requerirían descongelar por cuenta. Permitido solo mediante detección Superstate, que asume que el emisor descongela cuentas institucionales en la inscripción.
  • Punteros Group/Member — no son activamente dañinos, pero no revisados. Desallowado por defecto para mantener la superficie estrecha.

Contabilidad de tarifa de transferencia

Para mints que llevan TransferFeeConfig, cada swap, depósito y retiro mueve menos que la cantidad nominal. El SDK muestra ambas mitades del cálculo:
const { amountIn, amountOut, feeAmount, token2022FeeIn, token2022FeeOut } =
  await raydium.cpmm.computeSwapAmount({ ... });
Una UI correcta muestra:
  • amountIn + token2022FeeIn como “envías”
  • amountOut - token2022FeeOut como “recibes”
  • feeAmount como la tarifa del pool (LP + protocolo), que es separada de la tarifa de transferencia de Token-2022
Una UI ingenua que muestra solo amountIn → amountOut subestima los costos.

Tope maximumFee

Las tarifas de transferencia de Token-2022 se capping por transferencia. Para un mint del 1% con un tope de 10,000 tokens, una transferencia de 100,000,000 tokens paga solo 10,000 en tarifa. El computeSwapAmount del SDK aplica el tope; los llamadores diretos del programa deben replicarlo.

Transición de epoch

Una autoridad de mint puede programar un cambio de tasa de tarifa que se activa en el siguiente epoch. Durante la ventana de transición, dos configs (older, newer) viven en el mint a la vez y TransferChecked selecciona por epoch actual. Tanto CPMM SwapV2 como CLMM SwapV2 pasan la cuenta de mint completa en accounts, por lo que el programa lee la config correcta sin una búsqueda adicional. Si cotizas más de un epoch en avance a través de la Trade API o SDK, la tarifa ejecutada puede diferir de la tarifa cotizada — limitada por maximum_fee_basis_points de la config anterior.

Interest-bearing y ScaledUiAmount

El pool tiene la cantidad principal; el “monto de UI” es la cantidad principal multiplicada por un factor de escala dependiente del tiempo o configurado por admin. Las matemáticas del swap operan sobre la cantidad principal:
principal_in = ui_amount_in / ui_multiplier(now)
El SDK convierte automáticamente. Los lectores de RPC directo deben tratar pool.token0Vault.amount como principal.

Definición de “pool de Token-2022”

Un pool es un pool de Token-2022 si cualquiera mint tiene programId == TokenzQdB.... La API muestra esto:
GET /pools/info/ids?ids=<POOL_ID>
{
  "data": [{
    "mintA": { "programId": "TokenzQdB...", "hasTransferFee": true, ... },
    "mintB": { "programId": "Tokenkeg...", ... }
  }]
}
Usa programId para despachar, y hasTransferFee para mostrar una advertencia de UI.

Helpers de 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);
  }
}

Errores comunes de integración

  • Pre-flighting solo el ID del programa. Un mint puede ser Token-2022 y no soportado. Camina la lista de extensiones contra la lista blanca (y la lista blanca estática) antes de permitir la creación del pool.
  • Confiar en la cotización del SDK cuando el mint no se acepta en absoluto. La API de cotización no se niega a cotizar — la creación del pool es lo que se revierte. Confirma la semántica de is_supported_mint fuera de cadena antes de exponer la creación del pool en tu UI.
  • Cotizar sin el corte de tarifa de transferencia. Un mint con tarifa de transferencia del 1% en ambos lados de un pool CPMM del 0.25% tiene una tarifa efectiva alrededor del 2.25%, no del 0.25%. Usa la cotización del SDK o la cotización de Trade API — nunca calcules la tarifa manualmente solo desde el tier de tarifa del pool.
  • Llamar la instrucción Swap heredada en un pool de Token-2022. Swap es anterior a Token-2022. Usa SwapV2 siempre que cualquiera de los mints sea Token-2022.
  • Listar automáticamente nuevos mints de Token-2022. Las billeteras y agregadores deben verificar TransferHook y NonTransferable antes de mostrar un mint a los usuarios; ambos son hostiles a Raydium.

Trabajo futuro

Elementos de hoja de ruta del protocolo y ecosistema de Solana que cambiarían esta matriz:
  • Programas de transfer-hook en lista blanca a nivel de Solana (convención del ecosistema evolucionando).
  • AMMs compatibles con confidential-transfer (etapa de investigación).
  • Registro por mint de CPMM más amplio (paridad con CLMM).
  • Actualización de dependencia para que la decodificación de ScaledUiConfig de CLMM funcione sin la heurística de Superstate.
Esta página se actualizará cuando alguno aterrice.

Enlaces

Fuentes:
  • 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 — instrucción de registro por mint.
  • raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs — creación de mint base Token-2022 de LaunchLab.