Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
O ID do programa e as seeds de PDA para CPMM estão listados canonicamente em
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 codificados.As seis contas de um pool CPMM
Cada pool CPMM é totalmente descrito por seis endereços derivados do programa (PDAs) sob o programa CPMM, mais uma contaAmmConfig compartilhada que ele referencia. Uma vez que você tenha os dois mints, pode derivar tudo deterministicamente sem tocar na rede.
E a configuração compartilhada:
Derivando um pool a partir de apenas dois mints
O ID do pool 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 exige 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 pegar o PDA canônico pode ser contornado pelo criador legítimo usando um keypair aleatório. Os PDAs downstream (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 ID do pool a partir do estado on-chain (por exemplo, contas PoolState sob o programa CPMM), não derivando o PDA canônico — este último perderá pools com keypair aleatório.Layouts de conta
As definições completas em Rust vivem na fonteraydium-cp-swap. Os campos abaixo são os que você lerá de uma integração.
PoolState
lp_supply— o espelho interno do pool do suprimento total do mint de LP. Use-o para matemática de compartilhamento de LP; o valor deve corresponder ao suprimento on-chain 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; ficam nos vaults até queCollectProtocolFee/CollectFundFeeseja chamado.status— um bitmask controlando seSwap,Deposit,Withdrawsão permitidos. Atualizado pelo admin viaUpdatePoolStatus. O SDK verifica isso antes de construir uma transação; se você está fazendo CPI diretamente, verifique você mesmo.token0_program/token1_program— o programa de token para fazer CPI para cada vault. Um pode ser SPL Token clássico e o outro Token-2022; 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 qual lado do swap ela é coletada.enable_creator_fee == falsezera o caminho de taxa de criador inteiramente. Quando habilitado,creator_fee_onseleciona:0= pegar taxa de qualquer token que seja a entrada do swap (BothToken);1= pegar taxa detoken_0apenas (pular em swapstoken_1 → token_0);2= pegar taxa detoken_1apenas. Definido na criação do pool viaInitializeWithPermission; não pode mudar depois.creator_fees_token_{0,1}— taxas de criador acumuladas, varridas porCollectCreatorFeeouCollectCreatorFeePermissionless. Ambos os caminhos zeram os contadores completos; o caminho sem permissão fixa os destinatários para os ATAs canônicos depool_creator.
AmmConfig
trade_fee_rateecreator_fee_ratesão frações do 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 do 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 o hash da seed usa 2 bytes big-endian. Erro de um byte na ordem de 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. 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 tiers de taxa.
creator_fee_rate) vive em AmmConfig e é compartilhada entre o tier de taxa. Se um pool particular realmente a cobra (enable_creator_fee) e de qual 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 as parcelas de LP / protocolo / fundo da taxa de trade. A varredura é via CollectCreatorFee ou a CollectCreatorFeePermissionless restrita por destino. 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 têm direito de criar um pool contra um determinado AmmConfig.
CreatePermissionPda pelo admin do CPMM ou por uma autoridade criadora de PDA de permissão dedicada. Apenas o admin do CPMM pode revogá-lo via ClosePermissionPda. Usuários finais não interagem com esta conta diretamente — é encanamento para fluxos entre programas. Veja security/admin-and-multisig para o limite de função e reference/program-addresses para endereços canônicos.
Vaults e Token-2022
vault0 e vault1 são propriedade do 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 de programa de token correto para cada lado nas contas de instrução Swap / Deposit / Withdraw.
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 está no lado receptor para depósitosSwapBaseInpute no lado de envio para saques. O programa calcula a quantidade líquida chegando ao vault e define a curva de acordo. Vejaalgorithms/token-2022-transfer-fees.MetadataPointereTokenMetadata. Metadados padrão on-mint. Sem efeito na matemática de swap.InterestBearingConfig. A quantidade 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 a quantidade 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 Initialize rejeitar com NotSupportMint. A exceção é uma pequena lista de mints codificada no programa (um punhado de pubkeys específicas) que contorna a verificação de extensão; é usada para integrar mints específicos caso a caso.
A lista de extensões verificadas e a lista de mints codificada 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 anexa uma nova observação se tempo suficiente passou desde a última. TWAPs são calculados lendo duas observações e dividindo Δcumulative / Δtime.
ObservationState PDA completo tem cerca de 4.100 bytes após os campos circundantes e 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 com pelo menos um bloco de diferença. Swaps dentro do mesmo bloco podem não produzir uma nova observação; ler de volta a trás pode retornar o mesmo registro.
products/clmm/accounts.
Ciclo de vida da conta
Pools CPMM e seus PDAs nunca são fechados. Mesmo com liquidez zero, o
poolState permanece. Isto é deliberado: re-inicializar 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. - Seeds canônicas / IDs de programa:
reference/program-addresses.

