Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
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. |
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
| # | 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_mintpor ordem de bytes). - Nenhum mint usa uma extensão fora da lista de permissões CPMM (
TransferFeeConfig,MetadataPointer,TokenMetadata,InterestBearingConfig,ScaledUiAmount) — vejaproducts/cpmm/accounts. Uma pequena lista de permissões por mint dentro do programa ignora a verificação para onboarding caso a caso. creatortem pelo menosinit_amount_0einit_amount_1nas ATAs respectivas.amm_config.disable_create_pool == false.
pool_stateexiste comlp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.- O iniciador de LP de
LOCKED_LP(100lamports de token LP) é permanentemente travado no pool —pool_state.lp_supplyregistraliquidity − 100enquanto100unidades de LP permanecem fora da circulação, evitando que o pool seja completamente drenado e divisão por zero. observation_stateé inicializado;observation_index = 0epool_id = pool_state.key().create_pool_feelamports 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 = falseecreator_fee_on = BothToken.Initializenão suporta habilitar taxa de criador — esse caminho éInitializeWithPermission.open_timeé ajustado parablock_timestamp + 1se o chamador passou um valor<= block_timestamp. Swaps são rejeitados antes deopen_time; depósitos e saques funcionam imediatamente.
reference/error-codes)
InvalidInput— mints não ordenados ou mints idênticos.NotSupportMint— extensão Token-2022 bloqueada.ExceededSlippage— raramente; seinit_amount_0/1resultarem em zero LP devido a incompatibilidade de decimais.
Deposit
Adicionar liquidez em ambos os tokens proporcionalmente ao pool.
Argumentos
| # | 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 |
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).
ExceededSlippage, ZeroTradingTokens, InvalidStatus se depósito estiver pausado.
Withdraw
Queimar tokens LP e receber ambos os tokens subjacentes proporcionalmente.
Argumentos
| # | 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 |
Deposit; lp_mint é editável porque os tokens LP são queimados.)
Matemática
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).
SwapBaseInput
Swap de entrada exata.
Argumentos
| # | 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 |
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_statuspermite swap.- Nenhum mint pausado ou congelado para essa autoridade.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— a transação arredonda para zero.NotApproved— pool está pausado para swaps viaUpdatePoolStatus.InvalidInput— mints não correspondem a nenhum dos mints de vault do pool.
SwapBaseOutput
Swap de saída exata.
Argumentos
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 |
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. |
| # | Nome | W | S | |
|---|---|---|---|---|
| 1 | authority | S | Deve corresponder à chave admin no programa CPMM. | |
| 2 | pool_state | W |
security/admin-and-multisig.
CreateAmmConfig
Criar um novo nível de taxa.
Argumentos
| # | Nome | W | S | |
|---|---|---|---|---|
| 1 | owner | W | S | Admin. |
| 2 | amm_config | W | Inicializado aqui. | |
| 3 | system_program |
- Sem
AmmConfigexistente com o mesmoindex. 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_rateparam = 1→protocol_fee_rateparam = 2→fund_fee_rateparam = 3→new_protocol_owner(passe bytesPubkeycomo reinterpretação)param = 4→new_fund_ownerparam = 5→create_pool_feeparam = 6→disable_create_pool
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
products/cpmm/code-demos— amostras TypeScript executáveis para o acima.reference/error-codes— a tabela completa de erros do Anchor.products/cpmm/fees— o modelo de acumulação de taxa queCollectProtocolFee/CollectFundFee/CollectCreatorFeedrenam.

