Skip to main content
Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
Raydium não aceita mints Token-2022 arbitrários. CPMM e CLMM executam um modo de lista de permissão rigorosa: apenas um pequeno conjunto de extensões passa por padrão; tudo o mais é rejeitado na criação do pool. Um punhado de mints confiáveis é admitido por endereço codificado; CLMM adicionalmente suporta um registro por mint gerenciado por admin e detecção de token Superstate em tempo de execução. Esta página é a referência única para o que é aplicado e onde, com citações de arquivo e linha no código-fonte do programa.

Suporte no nível do programa

As verificações de lista de permissão residem em: Não há verificação de mint em tempo de swap em CPMM ou CLMM — o controle é acionado apenas na criação do pool. Uma vez que um pool existe, os swaps simplesmente confiam que os mints não mudaram, o que é correto para as partes imutáveis do estado do mint Token-2022.

Congelamento de NFT de posição CLMM para emissores restritos

Contas de NFT de posição permanecem descongeladas por padrão. CLMM congela uma apenas quando a posição usa um caminho aberto V2 e pelo menos um mint do vault tem sua freeze_authority atual correspondendo à lista de emissores restritos codificada. A lista inicial contém a mesma autoridade usada pelo caminho de detecção Superstate abaixo. Definir o PDA do pool como a autoridade de congelamento do mint do NFT de posição não é em si um congelamento. Esta é uma regra de custódia de posição, não outra lista de permissão de criação de pool:
  • O pool já pode existir e permanecer permutável.
  • O mint do NFT de posição usa o PDA do pool CLMM como sua própria autoridade de congelamento; o emissor subjacente não controla o NFT de posição.
  • OpenPositionV2 cobre NFTs de posição SPL clássicos sobre ativos de pool Token-2022. OpenPositionWithToken22Nft cobre NFTs de posição Token-2022.
  • OpenPosition V1 não inspeciona mints do vault e não pode servir os ativos Token-2022 restritos direcionados pela lista enviada.
  • Posições existentes permanecem inalteradas.
Posições congeladas permanecem gerenciáveis por seu proprietário, mas não podem ser transferidas. ClosePosition descongela e queima atomicamente quando o cliente passa o pool como a primeira conta restante. Veja products/clmm/ticks-and-positions.

Mints quote LaunchLab

Os dois mints do LaunchLab são controlados de forma muito diferente, e a assimetria é fácil de perder.
  • Mint base — LaunchLab o cria. Um mint base Token-2022 é alcançável apenas através de initialize_with_token_2022, e o programa apenas anexará MetadataPointer e (opcionalmente) TransferFeeConfig. Qualquer outra coisa retorna NoSupportExtension. Um mint Token-2022 pré-existente não pode ser fornecido como base. Quando TransferFeeConfig é anexado, a transfer_fee_config_authority do mint é o PDA da autoridade de lançamento até a graduação, enquanto sua withdraw_withheld_authority é a transfer_fee_extension_auth configurada da plataforma a partir da criação do mint — o próprio programa launchpad não tem instrução de retirada retida. Veja products/launchlab/platform-config.
  • Mint quote — LaunchLab não o cria e não o verifica. CreateConfig aceita a conta do mint como fornecida, então não há equivalente is_supported_mint no lado quote. O único controle é quais mints um admin escolhe vincular a um GlobalConfig.
Isso torna vincular um mint quote Token-2022 uma ação de alta confiança, com o mesmo raciocínio das listas de permissão estáticas CPMM e CLMM abaixo: um mint quote TransferHook executaria seu hook em cada compra, venda e reivindicação de taxa em cada pool cotado nele, e um mint quote PermanentDelegate permitiria que o delegado varresse os vaults quote desses pools. Nenhum é bloqueado pelo programa. O que LaunchLab faz corretamente uma vez que um mint quote é vinculado:
  • O vault quote, ambos os vaults de taxa e a conta de token do receptor de taxa de compartilhamento são criados no próprio programa do mint quote.
  • TransferFeeConfig no lado quote é precificado em todas as quatro instruções de negociação, e o limite de slippage é verificado contra o valor líquido do pagador em vez do movimento bruto do vault. Veja products/launchlab/instructions.
  • PoolState.token_program_flag registra os programas de ambos os mints — bit0 para o mint base, bit1 para o mint quote. Decodifique por bit; o byte não é um booleano. Veja products/launchlab/accounts.
A instrução Initialize descontinuada ainda aceita um programa quote legado, então uma config com um mint quote Token-2022 é alcançável apenas através de InitializeV2 e InitializeWithToken2022.

Lista de permissão de extensões CPMM e CLMM

Após os atalhos de whitelist estático (cobertos abaixo), o programa itera as extensões do mint e rejeita o mint se ele carregar qualquer extensão que não seja estas cinco: Qualquer coisa não nesta lista — TransferHook, NonTransferable, ConfidentialTransferMint, PermanentDelegate, MintCloseAuthority, DefaultAccountState, GroupPointer, GroupMemberPointer, MemberPointer, Pausable, etc. — faz com que is_supported_mint retorne false e a criação do pool reverta. As linhas relevantes (CPMM, forma idêntica em CLMM):
cp-swap/src/utils/token.rs:190–200

Caminhos de bypass

Um mint Token-2022 que não se encaixa na lista de permissão ainda pode ser admitido através de um dos três bypasses explícitos. Eles são tentados em ordem, antes da iteração de extensão ser executada.

1. Whitelist estática de mints

Um array constante MINT_WHITELIST de strings base58 é codificado em cada programa. Se o endereço do mint corresponder, a função retorna true imediatamente e nenhuma verificação de extensão é realizada. Esses endereços são incorporados no programa; atualizar a lista requer uma atualização de programa através do multisig de atualização 3/4.

2. Registro por mint — apenas CLMM

CLMM adicionalmente consulta um PDA SupportMintAssociated com seed [b"support_mint", mint]. Se esse PDA existe para o mint, ele é admitido independentemente de seu conjunto de extensões. O PDA é criado por CreateSupportMintAssociated (admin/create_support_mint_associated.rs). A instrução é controlada para dois signatários:
  • crate::admin::ID — a autoridade admin padrão do Raydium.
  • crate::create_support_mint_associated_owner::ID — uma autoridade dedicada para este propósito: RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY (mainnet), rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5 (devnet).
Efeito: a equipe CLMM pode optar por um mint Token-2022 específico na criação do pool sem uma atualização de programa. CPMM não tem equivalente — sua lista de permissão é estritamente codificada em fonte.

3. Detecção Superstate — apenas CLMM

CLMM tem um terceiro caminho especificamente para ativos tokenizados do Superstate, que usam a extensão ScaledUiConfig que a versão de spl-token-2022 vinculada ao programa CLMM não consegue desempacotar. Em vez de atualizar a dependência, CLMM detecta tokens Superstate pela forma de sua autoridade:
raydium-clmm/programs/amm/src/util/token.rs:485 Um mint passa por este ramo se todos os quatro forem verdadeiros:
  • Seu programa proprietário é o programa Token-2022.
  • Sua freeze authority é igual a superstate_allowlist::ID. Veja reference/program-addresses para os valores mainnet-beta e devnet.
  • Sua extensão DefaultAccountState está definida como Frozen.
  • Seu delegado permanente também é superstate_allowlist::ID.
Esta é uma heurística, não um registro — qualquer mint futuro que o Superstate emita com a mesma forma de autoridade será admitido automaticamente.

O que os bypasses não dispensam

Os bypasses pulam a lista de permissão de extensões, mas o programa ainda aplica:
  • O mint é propriedade de Token ou Token-2022. Um programa de token customizado é rejeitado upstream.
  • Os vaults do pool são criados com as extensões ATA corretas para pools Token-2022 (ImmutableOwner, etc.).
  • Todas as transferências passam por transfer_checked — mints com taxa chegam ao valor correto no vault.
Um mint na whitelist ou registrado em PDA que, por exemplo, adiciona um TransferHook depois não ganha uma verificação em tempo de swap; o hook simplesmente seria executado em cada transferência e poderia bloquear swaps. Whitelisting é, portanto, uma ação de alta confiança.

Semântica “Bloqueado”

Quando is_supported_mint retorna false, a criação do pool reverte com ErrorCode::NotSupportMint (CPMM) / ErrorCode::NotSupportMint (CLMM). Veja reference/error-codes para os códigos numéricos. Pools existentes não podem falhar retroativamente nesta verificação — o controle é executado apenas na criação. Extensões de mint são imutáveis para as categorias que Raydium rejeita (transfer hook, non-transferable, confidential transfer não podem ser adicionados pós-criação), então a verificação estática é suficiente.

Por que cada extensão excluída é excluída

  • TransferHook — invoca um programa customizado em cada transferência, com consumo de CU arbitrário, condições de falha arbitrárias e a capacidade de reentrar o programa chamador. Nenhuma sandbox segura existe. Alguns DEXes mantêm listas de permissão de hooks; Raydium não.
  • NonTransferableTransfer sempre falha. Um pool não pode tomar custódia.
  • ConfidentialTransfer — os valores de transferência são criptografados; a curva não consegue precificar o swap.
  • PermanentDelegate — um detentor do delegado pode varrer qualquer conta de token, incluindo o vault do pool. Permitido apenas via whitelist estático para emissores confiáveis (por exemplo, stablecoins regulados).
  • MintCloseAuthority — o mint pode ser fechado; pools existentes se tornam inutilizáveis. Desaprovado por padrão.
  • DefaultAccountState (Frozen) — ATAs do pool chegariam em estado Frozen e exigiriam descongelamento por conta. Permitido apenas via detecção Superstate, que assume que o emissor descongela contas institucionais no registro.
  • Ponteiros de grupo/membro — não ativamente prejudiciais, mas não revisados. Desaprovados por padrão para manter a superfície estreita.

Contabilidade de taxa de transferência

Para mints carregando TransferFeeConfig, cada swap, depósito e retirada move menos que o valor nominal. O SDK expõe ambas as metades do cálculo:
Uma UI correta mostra:
  • amountIn + token2022FeeIn como “você envia”
  • amountOut - token2022FeeOut como “você recebe”
  • feeAmount como a taxa do pool (LP + protocolo), que é separada da taxa de transferência Token-2022
Uma UI ingênua que mostra apenas amountIn → amountOut subestima custos.

Limite maximumFee

As taxas de transferência Token-2022 são limitadas por transferência. Para um mint de 1% com limite de 10.000 tokens, uma transferência de 100.000.000 tokens paga apenas 10.000 em taxa. O computeSwapAmount do SDK aplica o limite; chamadores diretos de programa devem replicá-lo.

Transição de época

Uma autoridade de mint pode agendar uma mudança de taxa que se ativa na próxima época. Durante a janela de transição, duas configs (older, newer) vivem no mint ao mesmo tempo e TransferChecked seleciona por época atual. CPMM SwapV2 e CLMM SwapV2 ambos passam a conta de mint completa em accounts, então o programa lê a config correta sem uma busca extra. Se você citar mais de uma época antecipadamente via Trade API ou SDK, a taxa executada pode diferir da taxa cotada — limitada pela maximum_fee_basis_points da config mais antiga.

Juros compostos e ScaledUiAmount

O pool mantém o valor principal; o “valor da UI” é o principal multiplicado por um fator de escala dependente do tempo ou definido por admin. A matemática de swap opera no principal:
O SDK converte automaticamente. Leitores RPC diretos devem tratar pool.token0Vault.amount como principal.

Definição de “pool Token-2022”

Um pool é um pool Token-2022 se qualquer um dos mints tem programId == TokenzQdB.... A API expõe isto:
Use programId para despachar, e hasTransferFee para exibir um aviso de UI.

Auxiliares SDK

Erros comuns de integração

  • Pré-voo apenas do ID do programa. Um mint pode ser Token-2022 e não suportado. Caminhe pela lista de extensões contra a lista de permissão (e a whitelist estática) antes de permitir a criação do pool.
  • Confiar na cotação do SDK quando o mint não é aceito. A API de cotação não se recusa a cotar — a criação do pool é o que reverte. Confirme a semântica is_supported_mint off-chain antes de expor a criação do pool em sua UI.
  • Cotar sem o corte de taxa de transferência. Um mint com taxa de transferência de 1% em ambos os lados de um pool CPMM de 0,25% tem uma taxa efetiva em torno de 2,25%, não 0,25%. Use a cotação do SDK ou cotação da Trade API — nunca calcule taxa manualmente apenas a partir do nível de taxa do pool.
  • Chamar a instrução Swap legada em um pool Token-2022. Swap é anterior ao Token-2022. Use SwapV2 sempre que qualquer mint for Token-2022.
  • Auto-listar novos mints Token-2022. Carteiras e agregadores devem verificar TransferHook e NonTransferable antes de exibir um mint aos usuários; ambos são hostis ao Raydium.

Trabalho futuro

Itens do roteiro do ecossistema Solana e protocolo que mudariam esta matriz:
  • Programas de transfer-hook na lista de permissão no nível Solana (convenção de ecossistema evoluindo).
  • AMMs compatíveis com confidential-transfer (estágio de pesquisa).
  • Registro por mint CPMM mais amplo (paridade com CLMM).
  • Atualização de dependência para que a decodificação ScaledUiConfig do CLMM funcione sem a heurística Superstate.
Esta página será atualizada quando qualquer uma delas chegar.

Ponteiros

Fontes:
  • 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 — instrução de registro por mint.
  • raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs — criação de mint base Token-2022 do LaunchLab.
  • raydium-launchpad/programs/launchpad/src/instructions/admin/create_config.rs — vinculação de mint quote do LaunchLab (sem verificação de extensão).