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 →
A partir da atualização 2026-07, a dependência do OpenBook / Serum do AMM v4 foi removida — nenhuma instrução lê ou escreve estado do OpenBook. As contas de mercado abaixo são mantidas apenas como placeholders posicionais nos layouts de instrução v1 legados (aceitos mas ignorados) e como campos de referência em AmmInfo. Use os pontos de entrada de swap V2, que as omitem completamente. Esta página ainda agrupa as contas em seções “pool-owned” e “OpenBook (legacy)” para leitura de transações antigas.

Inventário

Um pool AMM v4 registra um mercado vinculado em AmmInfo na criação. O quadro completo: Nota: o prefixo “serum” é mantido no IDL e nomes de campos do AMM v4 para compatibilidade com versões anteriores. Essas contas não são mais funcionais após a remoção do OpenBook.

AmmInfo

A conta de estado raiz do pool. Grande (≈ 752 bytes) porque carrega referências de pool e OpenBook inline.
O layout da struct não foi alterado (compatível em bytes) para que desserializadores existentes continuem funcionando, mas após a remoção do OpenBook os campos marcados como DEPRECATED acima não são mais escritos — os contadores de volume swap_* estão congelados em seu último valor. Para análise de volume, use logs de trade em vez desses campos. Apenas need_take_pnl_* e pool_open_time são mantidos ativamente.
Campos voltados para integradores:
  • coin_vault, pc_vault — os vaults SPL Token do pool. coin é token_0 por convenção Serum/OpenBook (base), pc é token_1 (quote).
  • coin_decimals, pc_decimals — correspondendo aos mints.
  • open_orders, target_orders, market — campos de referência legados. Ainda presentes em AmmInfo e ainda passados posicionalmente nos layouts de instrução v1, mas o programa não os lê ou valida mais. Os pontos de entrada de swap V2 os omitem.
  • fees.swap_fee_numerator / swap_fee_denominator — a taxa de trade combinada. Padrão 25 / 10_000 = 0.25%.
  • status — um único estado enumerado u64 que controla as operações, não uma bitmask. Configurável por admin via SetParams com param = 0 (Status). Veja Status abaixo.
  • lp_amount — o total interno de LP do pool. Não é igual a lp_mint.supply: é exatamente um token LP inteiro (10^coin_decimals unidades base) mais alto, porque essa quantia é contada na inicialização mas nunca mintada. Toda a matemática pro-rata usa lp_amount, então use-o também.
  • amm_owner — escrito na criação a partir da chave de admin codificada no programa, não a partir do criador.
  • state_data.need_take_pnl_* — delta entre taxas acumuladas brutas e o que foi varrido. TakePnl zera esses valores.

A fiação do OpenBook

Removida. A dependência do OpenBook / Serum foi deletada do programa (atualização 2026-07). As contas descritas nesta seção não são mais validadas ou usadas. Elas permanecem como campos de referência em AmmInfo e como placeholders posicionais nos layouts de instrução v1 legados. Use os pontos de entrada de swap V2 (SwapBaseInV2 / SwapBaseOutV2) que pulam essas contas completamente.
Quando você chama uma instrução v1 legada SwapBaseIn / SwapBaseOut, Deposit ou Withdraw, a contagem de contas ainda deve corresponder ao layout antigo (as contas de mercado ocupam suas posições históricas), mas seu conteúdo não é mais verificado — nenhum CPI é emitido contra elas. Código novo deve usar as variantes de swap V2, que não aceitam essas contas.
O amm_open_orders do AMM é uma conta de propriedade do OpenBook que mantém o estado de ordem limitada do pool neste mercado: ordens ativas, saldos liquidados, referrers, etc. amm_target_orders é do lado do AMM: mantém a intenção de grade do AMM (preço/tamanho para cada slot de ordem) para que o programa possa comparar barato contra o que está atualmente postado e colocar / cancelar a diferença.

PDAs de autoridade

Existe exatamente um PDA amm_authority para todo o programa AMM v4. Sua seed é trivial (["amm authority"]) e seu bump é armazenado em cada AmmInfo. Esta autoridade assina todos os movimentos de token para todos os pools AMM v4.
Não existe uma segunda autoridade com escopo de pool: este único PDA cobre tudo o que o programa assina. Seu bump é 254 na mainnet e é espelhado em cada AmmInfo como nonce; WithdrawExcessLamports o re-deriva com esse nonce codificado.

Vaults

Os vaults SPL Token do pool são contas de token padrão cujo owner é amm_authority. Não são ATAs — seus endereços são PDAs derivadas em Initialize2 a partir de [AMM_V4_PROGRAM_ID, market, "coin_vault_associated_seed"] e [AMM_V4_PROGRAM_ID, market, "pc_vault_associated_seed"]. O mint não é uma seed, e nem amm_id. Os endereços são armazenados em AmmInfo; a derivação é uma curiosidade única. Token-2022 não é suportado. O programa codifica o ID do programa SPL Token para todos os movimentos de vault. Tentar vincular um pool AMM v4 a um mint Token-2022 falha em Initialize2 com InvalidSplTokenProgram.

LP mint

Um mint SPL Token clássico cuja autoridade é amm_authority. O suprimento total rastreia a propriedade de LP do pool; queimar LP retorna tokens de ambos os vaults pro-rata. Existe um espelho no estado: AmmInfo.lp_amount. Ele não é igual ao suprimento do mint — fica exatamente um token LP inteiro (10^coin_decimals unidades base) mais alto, porque essa quantia é contada na inicialização mas nunca mintada. Toda computação pro-rata no programa divide por lp_amount, então use esse campo em vez do suprimento on-chain do mint.

Status

AmmInfo.status é um único estado enumerado u64, não uma bitmask. Teste-o por igualdade — um cliente que testa status & 1 classifica erroneamente todos os pools ativos, porque o estado normal de negociação é 6, que tem o bit 0 definido. Initialize2 escreve 7 quando open_time está no futuro e 6 caso contrário; um pool em 7 muda a si mesmo para 6 no primeiro swap em ou após state_data.pool_open_time. Um valor fora de 0..=7 faz AmmStatus::from_u64 entrar em pânico. O multisig Raydium define o estado via SetParams com param = 0 (Status); apenas os valores 1–7 são aceitos. (AdminCancelOrders foi removido.)

Observação / oracle

AMM v4 não tem conta de observação dedicada, e desde a remoção do OpenBook também não há estado de livro de ordens do qual derivar uma. Se você precisa de um TWAP Raydium com suporte de programa, use CPMM ou CLMM — ambos mantêm um buffer ring ObservationState. Caso contrário, indexe os logs de swap off-chain.

Derivando contas de um pool do zero

As contas de pool do AMM v4 são PDAs simples indexadas pelo mercado vinculado — não são keypairs com seed, nem PDAs por par. Todas elas usam o mesmo formato de três seeds [AMM_V4_PROGRAM_ID, market, <label>] sob AMM_V4_PROGRAM_ID:
O mercado vinculado é a única seed variável, e é por isso que um mercado mapeia para exatamente um pool AMM v4. O SDK e a API pré-computam esses valores para você; veja Liquidity.getAssociatedPoolKeys do raydium-sdk-v2. Na prática, integradores leem o conjunto completo de contas do pool de GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID> ou do SDK. Derivação manual raramente é necessária.

Referência rápida de ciclo de vida

Pools e suas contas persistem indefinidamente. Mesmo se a liquidez for totalmente retirada, AmmInfo permanece.

O que ler onde

Fontes: