> ## 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.

# Instruções CPMM

> Todas as instruções do programa CPMM, com seus argumentos, lista de contas, pré/pós-condições e erros que pode retornar.

<Info>
  **Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.**

  [Ver versão em inglês →](/products/cpmm/instructions)
</Info>

## 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`](/pt/products/cpmm/accounts#vaults-and-token-2022). 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`](/pt/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).

## `SwapBaseInput`

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`](/pt/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`](/pt/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`](/pt/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

* [`products/cpmm/code-demos`](/pt/products/cpmm/code-demos) — amostras TypeScript executáveis para o acima.
* [`reference/error-codes`](/pt/reference/error-codes) — a tabela completa de erros do Anchor.
* [`products/cpmm/fees`](/pt/products/cpmm/fees) — o modelo de acumulação de taxa que `CollectProtocolFee` / `CollectFundFee` / `CollectCreatorFee` drenam.

Fontes:

* [`raydium-io/raydium-cp-swap` — instructions](https://github.com/raydium-io/raydium-cp-swap/tree/master/programs/cp-swap/src/instructions)
* [Raydium SDK v2 — `@raydium-io/raydium-sdk-v2`](https://github.com/raydium-io/raydium-sdk-V2)
