Skip to main content
Esta página foi traduzida automaticamente por IA. A versão em inglês é a fonte oficial.Ver versão em inglês →
Esta entrada cobre uma atualização futura do programa CPMM. Foi verificada contra o branch de lançamento local (0dde43d, 11 de setembro de 2026) antes da implantação. Confirme o programa implantado antes de confiar nas novas instruções ou nas listas de contas alteradas.
A taxa de criador do CPMM sempre foi inteiramente para o criador do pool. Este lançamento permite que o protocolo retenha uma parte dela — negociável por nível de taxa, ou por criador em um nível de taxa — sem alterar como a taxa é cobrada. A escolha de design que mantém o raio de explosão pequeno: a divisão acontece no momento da coleta, não no momento do swap. Um swap ainda cobra creator_fee_rate e ainda acumula o valor inteiro em creator_fees_token_{0,1}. Quando CollectCreatorFee ou CollectCreatorFeePermissionless é executado, o saldo acumulado é dividido, a parte do protocolo é reclassificada como uma taxa de protocolo no mesmo pool, e apenas a parte do criador sai do cofre. Cotações, a curva, k e todos os caminhos voltados para LP não são afetados.

TL;DR para integradores

  • Ambas as instruções de coleta de taxa de criador mudaram suas listas de contas. Isto é uma quebra. CollectCreatorFee ganha creator_fee_share na posição 5. CollectCreatorFeePermissionless ganha amm_config em 5 e creator_fee_share em 6. Ambas as inserções ficam antes dos cofres, então tudo depois se desloca. Reconstrua essas transações; não as corrija.
  • creator_fee_share deve ser passado mesmo quando não existe. É declarado com uma restrição de seed mas lido como uma conta não verificada, então o endereço deve ser o PDA canônico em ["creator_fee_share", creator, amm_config] enquanto a conta em si é opcional. Quando está vazia, o programa volta para AmmConfig.creator_fee_share_rate.
  • AmmConfig ganha creator_fee_share_rate, esculpido do padding. A conta ainda tem 236 bytes e cada config existente continua desserializando — mas o primeiro u64 do antigo padding: [u64; 15] agora é um campo ativo. Decodificadores que modelam a cauda como um array de 15 elementos leem a taxa de compartilhamento como padding[0].
  • PoolState não foi alterado. 637 bytes, mesmos offsets, mesmos campos. A parte do protocolo é registrada nos contadores existentes protocol_fees_token_{0,1} — não há novo contador e nenhuma nova instrução de coleta para isso.
  • protocol_fees_token* agora cresce fora dos swaps. Qualquer monitor que reconcilie acúmulo de protocolo contra volume de negociação verá saltos em cada coleta de taxa de criador.
  • Um estimador de pagamento de criador que lê creator_fees_token* agora superestima. Multiplique por (1 − share_rate / 1_000_000), resolvido para esse par (creator, amm_config).
  • Duas instruções de admin são adicionadas: CreateCreatorFeeShare e CloseCreatorFeeShare. Um novo parâmetro UpdateAmmConfig: 8creator_fee_share_rate.
  • Sem novos códigos de erro. Os novos caminhos reutilizam InvalidOwner (6001), InvalidInput (6003) e MathOverflow (6011). 60006015 não foram alterados.
  • Uma atualização de IDL é necessária — duas novas instruções, um novo tipo de conta, duas listas de contas alteradas, um novo campo de config.

Como a divisão funciona

Resolução, em ordem de prioridade:
  1. PDA CreatorFeeShare em ["creator_fee_share", creator, amm_config] — quando a conta existe e é de propriedade do CPMM, seu share_rate vence.
  2. AmmConfig.creator_fee_share_rate — o padrão do nível de taxa, usado caso contrário.
Ambos são u64 sobre FEE_RATE_DENOMINATOR_VALUE = 1_000_000 e ambos são verificados contra esse limite. Então, por lado de token:
Três propriedades que os testes do programa fixam:
  • O arredondamento favorece o criador. A parte é arredondada para baixo, então o pó fica com o criador — a mesma direção que Fees::protocol_fee e Fees::fund_fee, que também esculpem uma parte de uma taxa já acumulada. 20% de uma taxa de 1 unidade é 0, não 1.
  • O valor é conservado. creator_amount + shared_amount == creator_fee para cada taxa e cada taxa até u64::MAX.
  • share_rate = 0 é exatamente o comportamento antigo. Tanto o valor de config padrão quanto um PDA ausente dão ao criador a taxa inteira, então nada muda para nenhum pool existente até que um admin defina uma taxa.
Como protocol_fees_token* e creator_fees_token* já são ambos subtraídos em vault_amount_without_fee, mover valor entre eles não muda a visão da curva sobre o cofre. Nenhum LP vê uma mudança de preço em uma coleta de taxa de criador, e a verificação k não é alterada.
A taxa é lida na coleta, não no acúmulo. Taxas que se acumularam enquanto a taxa era 0 se liquidam em qualquer taxa que estiver em vigor quando alguém finalmente chamar Collect*. Não há snapshot por época ou por swap.

Mudanças na lista de contas

CollectCreatorFee — uma inserção: CollectCreatorFeePermissionless — duas inserções:
Nenhuma mudança falha de forma alta e útil. As contas inseridas não estão no final da lista, então um cliente antigo não “perde uma conta” — ele passa ao programa um cofre onde um config é esperado e a transação falha na desserialização. Regenere a partir do novo IDL e verifique se qualquer lançamento de SDK que você fixar carrega as novas contas antes de apontá-lo para o programa atualizado.
Tabelas de contas completas em products/cpmm/instructions.

CreateCreatorFeeShare e CloseCreatorFeeShare

CreateCreatorFeeShare(share_rate: u64) inicializa o PDA; CloseCreatorFeeShare o fecha e retorna o aluguel ao signatário. Ambos aceitam o admin do programa compartilhado ou um proprietário dedicado de compartilhamento de taxa de criador — um novo par de chaves codificado seguindo o mesmo padrão cfg devnet/mainnet que as outras autoridades delegadas do programa. Endereços em reference/program-addresses. Pontos dignos de nota:
  • O criador do pool não é parte de nenhuma instrução e não assina. A conta creator não é verificada — o PDA pode ser criado para uma chave que ainda não possui nenhum pool.
  • Uma conta cobre um par (creator, amm_config), então governa cada pool que esse criador possui nesse nível de taxa. Um criador com pools em dois níveis precisa de duas contas para ser coberto em ambos.
  • Não há caminho de atualização. init falha em uma segunda criação para o mesmo par; para alterar uma taxa, feche e recrie.

Parâmetro 8 de UpdateAmmConfig

Define o compartilhamento padrão do nível de taxa. Não está relacionado a protocol_fee_rate (parâmetro 1), que divide a taxa de negociação — um ponto que vale a pena ter cuidado nas ferramentas de admin, já que os dois se parecem e ambos caem em protocol_fees_token*.

Viajando junto

Correção de ordenação de CollectExcessLamports. A instrução agora faz duas passagens sobre remaining_accounts — cada CPI de programa de token primeiro, depois os débitos diretos de PDAs de propriedade do CPMM — em vez de despachar em ordem do chamador. Intercalar os dois abortou com UnbalancedInstruction do runtime (“a soma dos saldos de conta antes e depois da instrução não correspondem”) sempre que um PDA era debitado antes de um CPI, porque as mudanças de lamport pendentes do chamador são apenas liberadas nas contas que um CPI realmente carrega. A interface da instrução não foi alterada; os chamadores ainda passam fontes em qualquer ordem, e agora isso é genuinamente seguro. Metadados de compilação verificável. O Cargo.toml do workspace declara [workspace.metadata.cli] solana = "3.1.10", então uma compilação verificável resolve o mesmo Solana CLI contra o qual o programa foi compilado. Sem efeito on-chain.

O que não mudou

  • PoolState — 637 bytes, mesmos campos, mesmos offsets. A parte do protocolo reutiliza o bucket de protocolo existente em vez de adicionar contadores próprios.
  • AmmConfig::LEN — ainda 236 bytes.
  • Matemática de swap, cotação e a verificação k. A taxa de criador é cobrada exatamente como antes.
  • CollectProtocolFee / CollectFundFee — mesmas contas, mesmos signatários. CollectProtocolFee simplesmente tem mais para coletar.
  • Códigos de erro. 60006015 sem alteração; nada acrescentado.
  • Cada outra instrução e o ID do programa.

Páginas atualizadas

  • products/cpmm/fees — nova seção “Compartilhamento de protocolo da taxa do criador” cobrindo resolução de taxa, aritmética de divisão, arredondamento e consequências do integrador; creator_fee_share_rate adicionado à lista de taxas/unidades e tabela de parâmetros padrão; tabela de fluxo de coleta reformulada.
  • products/cpmm/instructions — aviso de mudança quebrada no topo; tabelas de contas completas para ambos os caminhos de taxa de criador; novas seções CreateCreatorFeeShare e CloseCreatorFeeShare; parâmetro 8 de UpdateAmmConfig; nota de ordenação de CollectExcessLamports; linhas de resumo e matriz de mudança de estado.
  • products/cpmm/accounts — nova seção de conta CreatorFeeShare; layout de AmmConfig e aviso de carve de padding; notas de contador de taxa de PoolState; linhas de ciclo de vida de conta.
  • products/cpmm/overview — chamada de taxa de criador e o marcador “Taxas previsíveis”.
  • products/cpmm/math — uma nota de que a divisão é deliberadamente ausente da matemática de swap.
  • products/cpmm/code-demos — aviso de que construtores de SDK pré-atualização emitem as listas de contas antigas; snippet de taxa acumulada anotado.
  • reference/program-addresses — nova seção “Autoridade de compartilhamento de taxa de criador do CPMM”; creator_fee_share adicionado ao bloco de seed de PDA.
  • reference/fee-comparisoncreator_fee_share_rate chamado como uma quarta taxa de CPMM com uma base diferente.