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

# 2026-09-09 — CPMM: Anchor 1.0, recuperação de lamports excedentes e proprietários de taxa fixa

> CPMM migra para Anchor 1.0.2 no Agave 3.1.10 e adiciona uma instrução admin CollectExcessLamports para aluguel liberado pelo SIMD-0437. CreateAmmConfig agora escreve proprietários de taxa de protocolo e fundo codificados em vez do signatário, a lista branca de mint Token-2022 de quatro endereços é removida, e ClosePermissionPda aceita a autoridade de concessão dedicada. O erro 6015 é adicionado.

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

  [Ver versão em inglês →](/reference/changelog/2026-09-09-cpmm-anchor-1-and-excess-lamports)
</Info>

<Info>
  Esta entrada cobre uma atualização futura do programa CPMM. Foi verificada contra o branch de lançamento local antes da implantação. Confirme o programa implantado antes de depender da nova instrução ou do comportamento alterado de `CreateAmmConfig`.
</Info>

A mudança principal do CPMM é uma migração de framework: Anchor `0.32.1` para `=1.0.2`, e a cadeia de ferramentas de compilação de Agave 2.3.0 para 3.1.10. Acompanhando estão quatro mudanças comportamentais, três das quais importam apenas para ferramentas administrativas e uma — a remoção da lista branca de mint — que muda quais mints Token-2022 podem ser usados para um **novo** pool.

Tudo que um trader, um LP ou um criador de pool chama mantém sua lista de contas, argumentos e matemática.

## TL;DR para integradores

* **Nenhuma instrução voltada para o usuário foi alterada.** `Initialize`, `InitializeWithPermission`, `Deposit`, `Withdraw`, `SwapBaseInput`, `SwapBaseOutput` e todos os quatro caminhos `Collect*Fee` são byte-idênticos. Nenhum layout de conta foi alterado.
* **Uma instrução é adicionada: `CollectExcessLamports`.** Apenas admin, sem argumentos, contas passadas como `remaining_accounts`. Retorna lamports acima do mínimo isento de aluguel de vaults controlados por CPMM, mints LP e PDAs, e não toca em mais nada. Veja [`products/cpmm/instructions`](/pt/products/cpmm/instructions#collectexcesslamports).
* **Um código de erro é adicionado: `6015` `LamportsCalculateError`.** Os códigos `6000`–`6014` permanecem inalterados.
* **`CreateAmmConfig` não copia mais o signatário nos campos de proprietário de taxa.** Novas configurações recebem chaves `protocol_fee_owner` e `fund_fee_owner` codificadas. **Contas `AmmConfig` existentes não são tocadas** — continue lendo `protocol_owner` / `fund_owner` da conta em vez de assumir qualquer valor.
* **A `MINT_WHITELIST` Token-2022 de quatro endereços codificada foi removida.** O registro PDA `SupportMintAssociated` agora é o único bypass do CPMM da lista de permissões de extensão. Pools existentes não são afetados; a verificação é executada apenas na criação do pool.
* **`ClosePermissionPda` aceita a autoridade criadora de PDA de permissão dedicada,** não apenas o admin compartilhado.
* **Uma atualização de IDL é necessária.** Uma nova instrução, uma nova variante de erro.
* **O pacote cliente TypeScript foi renomeado.** `@coral-xyz/anchor` está congelado em `0.32.1`; o cliente Anchor 1.x publica como `@anchor-lang/core`.

## `CollectExcessLamports`

A etapa 1 do [SIMD-0437](/pt/solana-fundamentals/rent-and-reclaimable-rent) foi lançada na mainnet em 3 de setembro de 2026, reduzindo o mínimo isento de aluguel em 9% com mais quatro etapas por vir. Cada vault de pool CPMM, mint LP, `PoolState`, `AmmConfig`, `ObservationState`, `Permission` e conta `SupportMintAssociated` criada antes de uma etapa agora está superfundida, e lamports em uma conta de propriedade do programa só podem ser movidos por esse programa.

A instrução leva quatro contas fixas — a carteira signatário/destino, o PDA de autoridade `vault_and_lp_mint_auth_seed`, e **ambos** os programas de token — depois qualquer número de contas de origem em `remaining_accounts`. Ela despacha no proprietário de cada conta de origem: um CPI para `WithdrawExcessLamports` do programa de token (discriminante `38`) para uma conta de token ou mint, um débito direto para um PDA de propriedade do CPMM, e silenciosamente pula qualquer outra coisa.

SOL envolvido é o caso que vale a pena entender. O saldo de lamport de uma conta de token nativa *é* seu saldo de token, então ambos os programas de token rejeitam `WithdrawExcessLamports` em um. CPMM em vez disso faz CPI para `SyncNative` (dobrando o excesso doado no `amount` envolvido), mede quanto o amount cresceu, `UnwrapLamports` (discriminante `45`) para exatamente esse delta, e então requer que o saldo envolvido seja igual ao seu valor pré-sincronização — `LamportsCalculateError` se não for. **Um vault de pool do lado SOL mantém sua liquidez completa através de uma varredura**, e nenhum LP vê uma mudança de preço através de uma.

O signatário pode ser tanto o admin do programa compartilhado quanto uma carteira de coleta de lamports dedicada; os endereços estão em [`reference/program-addresses`](/pt/reference/program-addresses#excess-lamports-collection-wallets).

## `CreateAmmConfig` escreve proprietários de taxa fixa

Antes desta versão, `create_amm_config` definia ambos os campos de proprietário de taxa a partir do signatário chamador:

```rust theme={null}
amm_config.protocol_owner = ctx.accounts.owner.key();
amm_config.fund_owner      = ctx.accounts.owner.key();
```

Agora escreve as constantes do próprio programa:

```rust theme={null}
amm_config.protocol_owner = crate::protocol_fee_owner::ID;
amm_config.fund_owner      = crate::fund_fee_owner::ID;
```

Como `CreateAmmConfig` é controlado por `crate::admin::ID`, o efeito prático é que um nível de taxa recém-criado é varrido por carteiras operacionais dedicadas desde o início em vez de pelo multisig admin, e o admin não pode coletar de uma configuração que acabou de criar sem primeiro rotacionar o campo através do parâmetro `UpdateAmmConfig` `3` ou `4`.

As duas constantes seguem o mesmo padrão `cfg` devnet/mainnet que o resto dos endereços do programa, e na devnet ambas resolvem para a mesma chave. Veja [`reference/program-addresses`](/pt/reference/program-addresses#cpmm-fee-owner-wallets).

<Warning>
  **Isto não é uma migração.** Cada `AmmConfig` que já existe mantém qualquer `protocol_owner` e `fund_owner` com o qual foi criado. Uma ferramenta de coleta que começa a codificar as novas constantes falhará em configurações mais antigas, e uma que assume "a chave do admin" falhará nas novas. Leia os campos.
</Warning>

## A lista branca de mint Token-2022 é removida

`is_supported_mint` costumava fazer short-circuit em uma `MINT_WHITELIST` codificada de quatro endereços antes de iterar as extensões do mint. Esse array — e o `HashSet` construído a partir dele em cada chamada — é deletado. O que permanece é:

1. Mints SPL Token legados passam incondicionalmente.
2. Um mint com um PDA `SupportMintAssociated` inicializado em `[b"support_mint", mint]` passa incondicionalmente.
3. Caso contrário, toda extensão no mint deve ser uma de `TransferFeeConfig`, `MetadataPointer`, `TokenMetadata`, `InterestBearingConfig`, `ScaledUiAmount`.

O PDA de registro está no programa há um tempo, com seu próprio par `CreateSupportMintAssociated` / `CloseSupportMintAssociated` e sua própria autoridade dedicada ao lado do admin compartilhado, e é consultado tanto de `Initialize` quanto de `InitializeWithPermission`. Remover o array estático significa que integrar um mint agora é puramente uma ação on-chain em vez de uma atualização de programa — que é o ponto.

**Pools existentes não são afetados**, porque a verificação de mint é executada apenas na criação do pool. O que muda é que criar um *novo* pool CPMM para um dos quatro mints anteriormente na lista branca requer que esse mint tenha um PDA de registro — os que importam já têm na mainnet. O quadro completo, incluindo o que o registro faz e não dispensa, está em [`reference/token-2022-support`](/pt/reference/token-2022-support#bypass-paths).

## Ampliação de signatário de `ClosePermissionPda`

`CreatePermissionPda` já aceitava tanto o admin compartilhado quanto uma autoridade criadora de PDA de permissão dedicada, enquanto `ClosePermissionPda` estava fixado ao admin com uma restrição `address =`. O caminho de fechamento agora leva o mesmo par:

```rust theme={null}
constraint = (owner.key() == crate::admin::ID
           || owner.key() == crate::create_permission_pda_owner::ID) @ ErrorCode::InvalidOwner
```

Então a autoridade que emite uma concessão também pode revogá-la, sem rotear através do multisig. O erro em um signatário não autorizado é `InvalidOwner` (`6001`) de qualquer forma — a restrição `address =` antiga já carregava esse erro personalizado — então apenas o conjunto de signatários aceitos foi ampliado.

## Mudanças de cadeia de ferramentas e dependências

| Item                                                                                  | Antes                             | Depois                                      |
| ------------------------------------------------------------------------------------- | --------------------------------- | ------------------------------------------- |
| `anchor-lang` / `anchor-spl`                                                          | `0.32.1`                          | `=1.0.2`                                    |
| `Anchor.toml` `solana_version`                                                        | `2.3.0`                           | `3.1.10`                                    |
| `solana-sdk` / `-client` / `-account-decoder` / `-transaction-status` (crate cliente) | `2.3.0`                           | `3.0`                                       |
| `anchor-client` / `-lang` / `-spl` (crate cliente)                                    | `0.32.1`                          | `=1.0.2`                                    |
| README: `rustup default`                                                              | `1.81.0`                          | `1.91.0`                                    |
| README: Instalador Solana                                                             | `release.anza.xyz/v2.1.0`         | `release.anza.xyz/v3.1.10`                  |
| README: `avm install`                                                                 | `0.31.0`                          | `1.0.2` (mais `avm use 1.0.2`)              |
| README: Repositório Anchor                                                            | `coral-xyz/anchor`                | `solana-foundation/anchor`                  |
| Imagem Docker                                                                         | `solanafoundation/anchor:v0.32.1` | `solanafoundation/anchor:v1.0.2`            |
| `@coral-xyz/anchor`                                                                   | `0.32.1`                          | substituído por `@anchor-lang/core` `1.0.2` |
| `@solana/spl-token`                                                                   | `^0.4.8`                          | `^0.4.14`                                   |
| `typescript`                                                                          | `^4.3.5`                          | `^5.6.3`                                    |

Anchor 1.0 muda duas coisas em cada site de chamada CPI, o que importa se você integrar CPMM a partir do seu próprio programa: `CpiContext::new` leva a `Pubkey` do programa em vez de sua `AccountInfo`, e `Context` tem um parâmetro de lifetime em vez de quatro. No lado do cliente `RequestBuilder::instructions()` retorna `Vec<Instruction>` em vez de `Result<...>`, `CommitmentConfig` vem de `anchor_client` em vez de `solana_sdk`, e `spl-associated-token-account` 8.0 moveu seus auxiliares de endereço sob `::address` e seu ID de programa para `::program::ID`. Veja [`sdk-api/rust-cpi`](/pt/sdk-api/rust-cpi#cargo-dependencies).

Dois detalhes do sistema de compilação, nenhum com efeito on-chain: o crate do programa declara um recurso `localnet` que compila a carteira local como `admin` a partir de uma variável de ambiente `CPSWAP_LOCALNET_ADMIN` (então os testes controlados por admin podem realmente assinar — `yarn test:local-admin` conecta), e o bloco `[profile.release]` duplicado em `programs/cp-swap/Cargo.toml` foi deletado. Cargo ignora `[profile]` fora da raiz do workspace, então o bloco raiz já era o em efeito — incluindo o fato de que o `panic = "abort"` do bloco de nível de programa nunca foi aplicado.

## O que não mudou

* **Cada layout de conta.** `PoolState`, `AmmConfig`, `ObservationState`, `Permission`, `SupportMintAssociated` — mesmos tamanhos, mesmos offsets.
* **Códigos de erro `6000`–`6014`.**
* **A própria lista de permissões de extensão.** Ainda as mesmas cinco extensões.
* **Taxas de taxa, acúmulo de taxa e a curva.** `CollectExcessLamports` move lamports que nunca foram parte das reservas de nenhum pool.
* **`spl_memo`.** A restrição de programa de memo de `Withdraw` mudou de `spl_memo::id()` para `anchor_spl::memo::ID` — o mesmo endereço sob uma exportação `anchor-spl` renomeada.
* **ID do programa.** Inalterado.

## Páginas atualizadas

* `products/cpmm/instructions` — `CollectExcessLamports` adicionado com sua lista de contas e tabela de despacho por proprietário; `CreateAmmConfig` ganha seu argumento `creator_fee_rate` e uma nota sobre os proprietários de taxa fixa; linhas de resumo de instrução adicionadas para `CollectExcessLamports`, `CreateSupportMintAssociated`, `CloseSupportMintAssociated`; signatário de `ClosePermissionPda` corrigido; precondição de `Initialize` reescrita para o bypass somente de registro; linha de matriz de mudança de estado adicionada.
* `products/cpmm/accounts` — seção Token-2022 reescrita em torno do PDA de registro, com a remoção da lista branca chamada; signatário de `ClosePermissionPda` corrigido.
* `products/cpmm/overview` — sentença de lista branca reescrita.
* `products/cpmm/code-demos` — esqueleto Rust CPI atualizado para Anchor 1.0.
* `reference/token-2022-support` — seção de caminho de bypass reescrita em torno do PDA de registro, com a `MINT_WHITELIST` removida movida para uma seção "bypasses removidos".
* `reference/error-codes` — `6015` documentado.
* `reference/program-addresses` — novas seções "Autoridade de registro de suporte de mint CPMM", "Carteiras de proprietário de taxa CPMM" e "Carteiras de coleta de lamports excedentes"; nota de `ClosePermissionPda` corrigida.
* `sdk-api/rust-cpi`, `solana-fundamentals/toolchain`, `integration-guides/cpi-integration` — pinos Anchor 1.0 e notas de migração CPI.
* `solana-fundamentals/rent-and-reclaimable-rent` — nova seção "O que os programas Raydium varrem do seu próprio lado".
