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.
Resumo de instruções
| Nome do discriminador | Quem assina | O que faz |
|---|
Initialize | criador do pool | Criar um novo pool CPMM a partir de dois mints e uma AmmConfig. Sem permissão; qualquer um pode chamar. Define enable_creator_fee = false no novo pool. A conta pool_state pode ser o PDA canônico ou uma keypair aleatória recém-criada (veja contas de Initialize). |
InitializeWithPermission | pagador + detentor de um PDA Permission | Variante com permissão de Initialize. O chamador (payer) deve possuir um PDA Permission derivado de sua própria chave pública. Usado por plataformas que precisam de criação de pool controlada (ex: graduações LaunchLab). Permite que o chamador fixe creator_fee_on (BothToken / OnlyToken0 / OnlyToken1) e força enable_creator_fee = true no novo pool. O campo creator em pool_state é definido como uma conta creator passada separadamente, não como o pagador. Mesma flexibilidade de PDA canônico ou keypair aleatório para pool_state como em Initialize. |
Deposit | LP | Adicionar liquidez em ambos os tokens; receber tokens LP. |
Withdraw | LP | Queimar tokens LP; receber ambos os tokens subjacentes proporcionalmente. |
SwapBaseInput | swapper | Swap de entrada exata (amount_in entra, ≥ minimum_amount_out sai). |
SwapBaseOutput | swapper | Swap de saída exata (≤ maximum_amount_in entra, amount_out sai). |
CollectProtocolFee | protocol_owner (de AmmConfig) | Coletar taxas de protocolo acumuladas dos vaults. |
CollectFundFee | fund_owner (de AmmConfig) | Coletar taxas de fundo acumuladas dos vaults. |
CollectCreatorFee | pool_creator | Coletar taxas de criador acumuladas (se a taxa de criador foi habilitada). |
UpdatePoolStatus | admin | Pausar / retomar operações específicas em um pool via máscara de bits. |
UpdateAmmConfig | admin | Alterar taxas ou proprietário de protocolo/fundo em uma AmmConfig. |
CreateAmmConfig | admin | Criar um novo nível de taxa (nova conta AmmConfig). |
CreatePermissionPda | admin | Gerar um PDA Permission que permite a uma autoridade específica chamar InitializeWithPermission. |
ClosePermissionPda | admin | Revogar um PDA Permission emitido anteriormente. |
Máscara de status: o status de cada pool é um u8 onde bit 0 = depósito desabilitado, bit 1 = saque desabilitado, bit 2 = swap desabilitado (PoolStatusBitIndex { Deposit, Withdraw, Swap } no programa). Um bit limpo significa que a operação é permitida; um bit definido significa que está pausada. UpdatePoolStatus recebe um u8 bruto e sobrescreve o valor existente.
As próximas seções detalham cada um. A ordem das contas segue o IDL CPMM; o SDK e o cliente Rust em raydium-cp-swap/programs/cp-swap/src/instructions seguem essa ordem.
Initialize
Criar um novo pool CPMM.
Argumentos
init_amount_0: u64
init_amount_1: u64
open_time: u64 // timestamp Unix; swaps rejeitados antes disso
Contas (W = editável, S = assinante)
| # | Nome | W | S | Notas |
|---|
| 1 | creator | W | S | Paga aluguel; registrado como pool_state.pool_creator. |
| 2 | amm_config | | | O nível de taxa escolhido. |
| 3 | authority | | | PDA de autoridade global CPMM. |
| 4 | pool_state | W | S* | Inicializado aqui. Ou o PDA canônico ["pool", amm_config, token_0_mint, token_1_mint] ou uma keypair aleatória recém-criada — quando não é o PDA canônico, o programa exige que pool_state assine (require_eq!(pool_account_info.is_signer, true)). O caminho da keypair aleatória permite que um criador evite tentativas de front-running no PDA canônico. Os PDAs subsequentes (lp_mint, vaults, observation_state) são derivados de pool_state.key() de qualquer forma. |
| 5 | token_0_mint | | | Ordenado: token_0_mint < token_1_mint. |
| 6 | token_1_mint | | | |
| 7 | lp_mint | W | | Inicializado aqui. Autoridade definida como authority. |
| 8 | creator_token_0 | W | | ATA de origem para init_amount_0. |
| 9 | creator_token_1 | W | | ATA de origem para init_amount_1. |
| 10 | creator_lp_token | W | | Destino para LP (criado se ausente). |
| 11 | token_0_vault | W | | Inicializado aqui. Propriedade de authority. |
| 12 | token_1_vault | W | | |
| 13 | create_pool_fee | W | | ATA de destino para o create_pool_fee pago pelo criador. |
| 14 | observation_state | W | | Inicializado aqui. |
| 15 | token_program | | | SPL Token (para LP mint). |
| 16 | token_0_program | | | SPL Token ou Token-2022. |
| 17 | token_1_program | | | SPL Token ou Token-2022. |
| 18 | associated_token_program | | | |
| 19 | system_program | | | |
| 20 | rent | | | |
* pool_state assina apenas no caminho da keypair aleatória; o caminho do PDA canônico funciona sem pool_state assinar.
Pré-condições
- Mints são ordenados (
token_0_mint < token_1_mint por ordem de bytes).
- Nenhum mint usa uma extensão fora da lista de permissões CPMM (
TransferFeeConfig, MetadataPointer, TokenMetadata, InterestBearingConfig, ScaledUiAmount) — veja products/cpmm/accounts. Uma pequena lista de permissões por mint dentro do programa ignora a verificação para onboarding caso a caso.
creator tem pelo menos init_amount_0 e init_amount_1 nas ATAs respectivas.
amm_config.disable_create_pool == false.
Pós-condições
pool_state existe com lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.
- O iniciador de LP de
LOCKED_LP (100 lamports de token LP) é permanentemente travado no pool — pool_state.lp_supply registra liquidity − 100 enquanto 100 unidades de LP permanecem fora da circulação, evitando que o pool seja completamente drenado e divisão por zero.
observation_state é inicializado; observation_index = 0 e pool_id = pool_state.key().
create_pool_fee lamports são transferidos do criador para o receptor e sincronizados como SOL nativo (é uma ATA wSOL).
- A máscara de status do pool é
0 (depósito / saque / swap todos habilitados).
enable_creator_fee = false e creator_fee_on = BothToken. Initialize não suporta habilitar taxa de criador — esse caminho é InitializeWithPermission.
open_time é ajustado para block_timestamp + 1 se o chamador passou um valor <= block_timestamp. Swaps são rejeitados antes de open_time; depósitos e saques funcionam imediatamente.
Erros comuns (lista completa em reference/error-codes)
InvalidInput — mints não ordenados ou mints idênticos.
NotSupportMint — extensão Token-2022 bloqueada.
ExceededSlippage — raramente; se init_amount_0/1 resultarem em zero LP devido a incompatibilidade de decimais.
Deposit
Adicionar liquidez em ambos os tokens proporcionalmente ao pool.
Argumentos
lp_token_amount: u64 // quantos tokens LP cunhar para o LP
maximum_token_0: u64
maximum_token_1: u64
Contas
| # | Nome | W | S |
|---|
| 1 | owner | | S |
| 2 | authority | | |
| 3 | pool_state | W | |
| 4 | owner_lp_token | W | |
| 5 | token_0_account | W | |
| 6 | token_1_account | W | |
| 7 | token_0_vault | W | |
| 8 | token_1_vault | W | |
| 9 | token_program | | |
| 10 | token_program_2022 | | |
| 11 | vault_0_mint | | |
| 12 | vault_1_mint | | |
| 13 | lp_mint | W | |
Matemática
needed_token_0 = ceil(lp_token_amount * vault_0 / lp_supply)
needed_token_1 = ceil(lp_token_amount * vault_1 / lp_supply)
require(needed_token_0 <= maximum_token_0, "ExceededSlippage")
require(needed_token_1 <= maximum_token_1, "ExceededSlippage")
Sem mudança na proporcionalidade de k — ambos os vaults e lp_supply escalam pelo mesmo fator.
Pós-condições
lp_supply += lp_token_amount.
vault_0 += needed_token_0 (líquido de qualquer taxa de transferência Token-2022 na entrada).
vault_1 += needed_token_1 (líquido de qualquer taxa de transferência Token-2022 na entrada).
Erros comuns — ExceededSlippage, ZeroTradingTokens, InvalidStatus se depósito estiver pausado.
Withdraw
Queimar tokens LP e receber ambos os tokens subjacentes proporcionalmente.
Argumentos
lp_token_amount: u64
minimum_token_0: u64
minimum_token_1: u64
Contas
| # | Nome | W | S |
|---|
| 1 | owner | | S |
| 2 | authority | | |
| 3 | pool_state | W | |
| 4 | owner_lp_token | W | |
| 5 | token_0_account | W | |
| 6 | token_1_account | W | |
| 7 | token_0_vault | W | |
| 8 | token_1_vault | W | |
| 9 | token_program | | |
| 10 | token_program_2022 | | |
| 11 | vault_0_mint | | |
| 12 | vault_1_mint | | |
| 13 | lp_mint | W | |
(Idêntico a Deposit; lp_mint é editável porque os tokens LP são queimados.)
Matemática
out_token_0 = floor(lp_token_amount * vault_0 / lp_supply)
out_token_1 = floor(lp_token_amount * vault_1 / lp_supply)
require(out_token_0 >= minimum_token_0, "ExceededSlippage")
require(out_token_1 >= minimum_token_1, "ExceededSlippage")
Pós-condições
lp_supply -= lp_token_amount.
- Vaults enviam
out_token_0 / out_token_1 (bruto; o usuário recebe líquido de qualquer taxa de transferência Token-2022).
Swap de entrada exata.
Argumentos
amount_in: u64
minimum_amount_out: u64
Contas
| # | Nome | W | S |
|---|
| 1 | payer | | S |
| 2 | authority | | |
| 3 | amm_config | | |
| 4 | pool_state | W | |
| 5 | input_token_account | W | |
| 6 | output_token_account | W | |
| 7 | input_vault | W | |
| 8 | output_vault | W | |
| 9 | input_token_program | | |
| 10 | output_token_program | | |
| 11 | input_token_mint | | |
| 12 | output_token_mint | | |
| 13 | observation_state | W | |
A ordem entrada → saída é pela direção do usuário, não pelo token_0 / token_1 canônico do pool. O programa descobre qual vault é qual casando mints.
Matemática — veja products/cpmm/math.
Pré-condições
open_time <= now.
pool_status permite swap.
- Nenhum mint pausado ou congelado para essa autoridade.
amount_in > 0.
Erros comuns
ExceededSlippage — amount_out < minimum_amount_out.
ZeroTradingTokens — a transação arredonda para zero.
NotApproved — pool está pausado para swaps via UpdatePoolStatus.
InvalidInput — mints não correspondem a nenhum dos mints de vault do pool.
SwapBaseOutput
Swap de saída exata.
Argumentos
max_amount_in: u64
amount_out: u64
Contas — mesmas que SwapBaseInput.
Matemática — curva inversa com teto, veja products/cpmm/math.
Erros comuns — ExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.
CollectProtocolFee
Coletar taxas de protocolo acumuladas dos vaults para o destino de protocolo.
Argumentos — nenhum.
Contas
| # | Nome | W | S | |
|---|
| 1 | owner | | S | Deve corresponder a amm_config.protocol_owner. |
| 2 | authority | | | |
| 3 | pool_state | W | | |
| 4 | amm_config | | | |
| 5 | token_0_vault | W | | |
| 6 | token_1_vault | W | | |
| 7 | vault_0_mint | | | |
| 8 | vault_1_mint | | | |
| 9 | recipient_token_0_account | W | | |
| 10 | recipient_token_1_account | W | | |
| 11 | token_program | | | |
| 12 | token_program_2022 | | | |
Efeito
transfer pool_state.protocol_fees_token0 from vault_0 to recipient_0
transfer pool_state.protocol_fees_token1 from vault_1 to recipient_1
pool_state.protocol_fees_token0 = 0
pool_state.protocol_fees_token1 = 0
Sem mudança nos saldos efetivos da curva (as taxas acumuladas já foram excluídas).
Erro comum — NotApproved se o assinante não for protocol_owner.
CollectFundFee
Mesma forma que CollectProtocolFee mas assinado por fund_owner e zerando os contadores fund_fees_*.
CollectCreatorFee
Mesma forma novamente, assinado por pool_state.pool_creator. Emite transferências apenas se o pool foi inicializado com uma taxa de criador não-zero.
UpdatePoolStatus
Pausar ou retomar operações individuais em um pool. O campo status é uma máscara de bits:
| Bit | Flag | Efeito quando definido |
|---|
| 0 | DEPOSIT_DISABLED | Deposit rejeita com NotApproved. |
| 1 | WITHDRAW_DISABLED | Withdraw rejeita. |
| 2 | SWAP_DISABLED | SwapBaseInput / SwapBaseOutput rejeitam. |
Argumentos
status: u8 // nova máscara de bits
Contas
| # | Nome | W | S | |
|---|
| 1 | authority | | S | Deve corresponder à chave admin no programa CPMM. |
| 2 | pool_state | W | | |
A chave admin é a autoridade de upgrade no programa CPMM — na prática, o multisig da Raydium. Veja security/admin-and-multisig.
CreateAmmConfig
Criar um novo nível de taxa.
Argumentos
index: u16
trade_fee_rate: u64
protocol_fee_rate: u64
fund_fee_rate: u64
create_pool_fee: u64
Contas
| # | Nome | W | S | |
|---|
| 1 | owner | W | S | Admin. |
| 2 | amm_config | W | | Inicializado aqui. |
| 3 | system_program | | | |
Pré-condições
- Sem
AmmConfig existente com o mesmo index.
protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
UpdateAmmConfig
Alterar taxas ou propriedade em uma AmmConfig existente. Recebe um param: u8 (discriminador para qual campo atualizar) e um value: u64. A semântica de valor por param está no código-fonte; comumente:
param = 0 → trade_fee_rate
param = 1 → protocol_fee_rate
param = 2 → fund_fee_rate
param = 3 → new_protocol_owner (passe bytes Pubkey como reinterpretação)
param = 4 → new_fund_owner
param = 5 → create_pool_fee
param = 6 → disable_create_pool
As mudanças são assinadas pelo admin e afetam cada pool vinculado a essa AmmConfig no próximo swap. Sem migração; pools simplesmente leem os novos valores.
Matriz de mudanças de estado
| Instrução | lp_supply | Saldos de vault | Campos de taxa acumulada | observation |
|---|
Initialize | + LP init | + init_amount_{0,1} | 0 | init |
InitializeWithPermission | + LP init | + init_amount_{0,1} | 0 | init |
Deposit | + | + ambos | — | — |
Withdraw | − | − ambos | — | — |
SwapBaseInput | — | + entrada, − saída | + trade_fee dividido em protocolo/fundo; + creator_fee se habilitado | + (se intervalo decorrido) |
SwapBaseOutput | — | + entrada, − saída | + trade_fee dividido em protocolo/fundo; + creator_fee se habilitado | + (se intervalo decorrido) |
CollectProtocolFee | — | − (por buckets de protocolo) | protocol_* → 0 | — |
CollectFundFee | — | − (por buckets de fundo) | fund_* → 0 | — |
CollectCreatorFee | — | − (por buckets de criador) | creator_* → 0 | — |
UpdatePoolStatus | — | — | — | — |
Próximas etapas
Fontes: