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 foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
reference/program-addresses. Esta página se concentra em para que serve cada conta e os invariantes que ela mantém, não nos endereços hardcoded.
As seis contas de um pool CPMM
Cada pool CPMM é totalmente descrito por seis endereços derivados do programa (PDAs) sob o programa CPMM, além de uma contaAmmConfig compartilhada que ele referencia. Uma vez que você tenha os dois mints, pode derivar tudo de forma determinística sem tocar na rede.
| Conta | Seed(s) | Proprietário | Propósito |
|---|---|---|---|
authority | "vault_and_lp_mint_auth_seed" | CPMM | O signatário para cada movimento de vault e cada mint/burn de LP. Compartilhado entre todos os pools CPMM. |
poolState | "pool", ammConfig, token0Mint, token1Mint ou qualquer keypair aleatória fornecida pelo signatário | CPMM | A struct de estado do pool — par de mints, saldos de vault, fornecimento de LP, acúmulo de taxas, ponteiro de observação. A instrução Initialize do CPMM aceita tanto o PDA canônico derivado das quatro sementes quanto um keypair arbitrário assinado pelo criador. O caminho de keypair aleatória existe para derrotar um ataque de front-running onde um adversário observa o mempool e corre para ocupar o PDA canônico antes do criador legítimo. |
lpMint | "pool_lp_mint", poolState | SPL Token | O token LP do pool. Fornecimento = total de LP em aberto. Autoridade de mint = PDA de autoridade CPMM. |
vault0 | "pool_vault", poolState, token0Mint | SPL Token / Token-2022 | Mantém o saldo token0 do pool. Possuído pelo PDA de autoridade. |
vault1 | "pool_vault", poolState, token1Mint | SPL Token / Token-2022 | Mantém o saldo token1 do pool. Possuído pelo PDA de autoridade. |
observation | "observation", poolState | CPMM | Ring buffer de amostras de preço usadas para o TWAP. Escrito em cada swap. |
| Conta | Seed(s) | Proprietário | Propósito |
|---|---|---|---|
ammConfig | "amm_config", index: u16 | CPMM | Mantém as taxas de trade/protocolo/fundo/criador e chaves de admin. Uma por “faixa de taxa”. Poolstate vincula-se a uma na criação e não pode mudar depois. |
Derivando um pool de nada além de dois mints
Pool ID nem sempre é o PDA canônico.
Initialize aceita um keypair signatário arbitrário como pool_state além do PDA acima. Se a conta passada não corresponder ao PDA canônico, o programa requer que seja um signatário — ou seja, o criador passa um keypair novo que assina. Esta é a defesa contra front-run: qualquer terceiro correndo para agarrar o PDA canônico pode ser contornado pelo criador legítimo usando um keypair aleatório. Os PDAs posteriores (lpMint, vault0, vault1, observation) ainda são derivados de poolState.key(), então permanecem únicos para qualquer endereço usado. Ao indexar pools, sempre descubra o pool ID a partir do estado na cadeia (por exemplo, contas PoolState sob o programa CPMM), não derivando o PDA canônico — o último perderá pools com keypair aleatório.Layouts de contas
As definições Rust completas vivem na fonteraydium-cp-swap. Os campos abaixo são aqueles que você lerá de uma integração.
PoolState
lp_supply— o espelho interno do pool do fornecimento total do mint de LP. Use para matemática de compartilhamento de LP; o valor deve corresponder ao fornecimento na cadeia do mint, mas lê-lo dePoolStateevita uma busca de conta extra.protocol_fees_token{0,1},fund_fees_token{0,1}— taxas acumuladas ainda não varridas. Estas não afetam o preço do swap; elas ficam nos vaults até queCollectProtocolFee/CollectFundFeeseja chamado.status— uma máscara de bits controlando seSwap,Deposit,Withdrawsão permitidos. Atualizado pelo admin viaUpdatePoolStatus. O SDK verifica isto antes de construir uma transação; se você estiver CPIando diretamente, verifique por si mesmo.token0_program/token1_program— o programa de token para CPI em cada vault. Um pode ser SPL Token clássico e o outro Token-2022; eles são independentes.open_time— um timestamp Unix. Swaps antes desta hora falham. Depósitos são permitidos antes deopen_timepara que o pool possa ser inicializado.creator_fee_on/enable_creator_fee— juntos controlam se a taxa de criador opcional está ativa para este pool e de que lado do swap ela é coletada.enable_creator_fee == falsezera o caminho de taxa do criador completamente. Quando ativado,creator_fee_onseleciona:0= cobrar taxa de qualquer token que seja a entrada do swap (BothToken);1= cobrar taxa apenas detoken_0(pular em swapstoken_1 → token_0);2= cobrar taxa apenas detoken_1. Definido na criação do pool viaInitializeWithPermission; não pode mudar depois.creator_fees_token_{0,1}— taxas de criador acumuladas, varridas porCollectCreatorFee.
AmmConfig
trade_fee_rateecreator_fee_ratesão frações de volume, ambas denominadas em unidades de1/1_000_000.2500significa 0,25% do volume de trade.protocol_fee_rateefund_fee_ratesão frações da taxa de trade (não de volume), no mesmo denominador1/1_000_000. A taxa de criador não é uma fração da taxa de trade — é sua própria taxa independente. A aritmética completa está emproducts/cpmm/fees.indexé umu16, então a seed hash usa 2 bytes big-endian. Um erro de um byte na ordem dos bytes é um bug de integração comum.AmmConfigé imutável no nível do pool. Um pool aponta para umAmmConfigna criação e nunca muda. As mudanças de taxa se propagam porque o pool lê a configuração a cada swap — mas o pool não pode ser movido entre faixas de taxa.
creator_fee_rate) vive em AmmConfig e é compartilhada entre a faixa de taxa. Se um pool específico realmente a cobra (enable_creator_fee) e de que lado do swap ela cai (creator_fee_on) vivem em PoolState. A taxa de criador é independente da taxa de trade — é sua própria taxa, acumulada em seus próprios contadores (creator_fees_token_{0,1}), e nunca reduz os compartilhamentos LP / protocolo / fundo da taxa de trade. Varrer é via CollectCreatorFee. Veja products/cpmm/fees para a mecânica completa.
Permission
Uma pequena conta de controle de acesso usada por InitializeWithPermission. O programa CPMM suporta um caminho de criação de pool com permissão para que outros programas (por exemplo, LaunchLab ao graduar um token para CPMM) possam provar que estão autorizados a criar um pool contra um determinado AmmConfig.
CreatePermissionPda e revogado via ClosePermissionPda. Usuários finais não interagem com esta conta diretamente — é encanamento para fluxos entre programas.
Vaults e Token-2022
vault0 e vault1 são possuídos pelo PDA de autoridade do CPMM, e seu proprietário de programa de token (token_program) é SPL Token ou Token-2022, determinado na criação do pool pelo programa do mint. O pool lida com os dois casos de forma transparente — você passa o ID correto do programa de token para cada lado nas contas de instrução Swap / Deposit / Withdraw.
O CPMM impõe uma lista de permissões de extensão rigorosa na criação do pool (is_supported_mint em utils/token.rs). Um mint Token-2022 pode ser usado em um pool CPMM apenas se cada extensão que ele carrega estiver nesta lista:
TransferFeeConfig. Aplicado pelo mint em cada transferência. O pool fica no lado receptivo para depósitosSwapBaseInpute no lado emissor para saques. O programa calcula o valor líquido aterrando no vault e define a curva de acordo. Vejaalgorithms/token-2022-transfer-fees.MetadataPointereTokenMetadata. Metadados padrão de mint. Nenhum efeito na matemática de swap.InterestBearingConfig. O valor de UI do mint acumula juros. O vault armazena quantidades brutas; a curva opera apenas em quantidades brutas. UIs que mostram APR devem chamar os helpers Token-2022 para renderizar o valor de UI.ScaledUiAmount. Extensão de escala de exibição de UI. Mesmo tratamento queInterestBearingConfig— a curva usa quantidades brutas.
PermanentDelegate, TransferHook, DefaultAccountState, NonTransferable, ConfidentialTransfer, Group/GroupMember, MintCloseAuthority, etc. — causa que Initialize rejeite com NotSupportMint. A exceção é uma pequena lista de mints hardcoded no programa (um punhado de pubkeys específicas) que contorna a verificação de extensão; é usada para integrar mints específicas caso a caso.
A lista de extensões verificadas e a lista de mints whitelist vivem na fonte CP-Swap sob programs/cp-swap/src/utils/token.rs e podem mudar com futuras atualizações de programa.
Observation
A conta de observação é um ring buffer de entradasObservationState, cada uma armazenando um block_timestamp e um preço cumulativo. Em cada swap o programa adiciona uma nova observação se tempo suficiente passou desde a última. TWAPs são calculados lendo duas observações e dividindo Δcumulative / Δtime.
ObservationState completo tem cerca de 4.100 bytes após os campos circundantes e o discriminador.
Duas regras de consumidor:
- Não use uma única observação como preço. É um cumulativo, não um preço spot. Use duas delas para calcular um TWAP.
- Escolha observações pelo menos um bloco separado. Swaps no mesmo bloco podem não produzir uma nova observação; leitura back-to-back pode retornar o mesmo registro.
products/clmm/accounts.
Ciclo de vida da conta
| Evento | Contas criadas | Contas destruídas |
|---|---|---|
Initialize | poolState, lpMint, vault0, vault1, observation | — |
Deposit | — (pode criar ATA de LP do usuário) | — |
Withdraw | — | — |
Swap | — (pode criar ATA de destino do usuário) | — |
CollectProtocolFee | — | — |
CollectFundFee | — | — |
UpdatePoolStatus | — | — |
poolState permanece. Isto é intencional: reinicializar o mesmo pool depois preserva seu buffer de observação histórico e sua derivação de PDA permanece estável.
O que ler onde
- Listas de contas de instrução (qual dos acima é gravável/signatário para cada instrução):
products/cpmm/instructions. - Semântica de acúmulo de taxas:
products/cpmm/fees. - Matemática de swap / regra de atualização de observação:
products/cpmm/math. - Sementes canônicas / IDs de programa:
reference/program-addresses.


