AMMs (Raydium, Orca, Meteora)
Os principais AMMs da Solana mantêm liquidez concentrada e de produto constante em contas de pool de propriedade do programa. Integre diretamente quando precisar de roteamento personalizado, ações de LP ou swaps de CPI na chain fora do Jupiter.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
// Orca Whirlpool swap via SDK (construção de ix off-chain)
import { swapQuoteByInputToken, WhirlpoolContext } from "@orca-so/whirlpools-sdk";
const quote = await swapQuoteByInputToken(whirlpool, inputTokenMint, amountIn, slippageTolerance, programId);// Na chain: valida se as contas do pool correspondem ao programa esperado + mints
require_keys_eq!(pool_state.token_mint_a, expected_mint_a, ErrorCode::MintMismatch);
require_keys_eq!(pool_state.token_mint_b, expected_mint_b, ErrorCode::MintMismatch);Quando usar isso:
- Construindo fluxos de depósito/saque de LP.
- Swaps de CPI dentro do seu programa Anchor 0.32.1.
- Acessando liquidez concentrada (Orca Whirlpools, Meteora DLMM).
- Lendo reservas para precificação na chain sem um agregador.
Exemplo de Trabalho
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
// Estado do pool Raydium AMM v4 (layout de exemplo - busque e decodifique com o SDK)
const poolAddress = address("58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2"); // Pool legado SOL-USDC
const poolAccount = await rpc.getAccountInfo(poolAddress, { encoding: "base64" }).send();
if (poolAccount.value) {
console.log("Proprietário do pool:", poolAccount.value.owner);
console.log("Comprimento dos dados:", poolAccount.value.data.length);
}O que isso demonstra:
- O estado do pool é uma única conta pertencente ao programa AMM.
- Clientes decodificam o layout off-chain; programas on-chain validam os campos de proprietário e mint.
- Cada local (Raydium, Orca, Meteora) tem layouts de conta e IDs de programa distintos.
Mergulho Profundo
Como Funciona
- Raydium - Clássico AMM de produto constante v4 mais pools CLMM; liquidez profunda SOL-estável.
- Orca - Whirlpools usam liquidez concentrada com arrays de tick; capital eficiente para pares estáveis.
- Meteora - DLMM usa bins de preço discretos; popular para launchpads e pares voláteis.
- Swaps debitam o vault de entrada, creditam o vault de saída e atualizam os acumuladores de taxa atomicamente.
Comparação de Locais
| Local | Modelo | Melhor para | Nota do programa |
|---|---|---|---|
| Raydium AMM v4 | x*y=k | Pares amplos | Maduro, TVL alto |
| Orca Whirlpool | Concentrada | Faixas apertadas estáveis/voláteis | Contas de array de tick |
| Meteora DLMM | Passos de bin | Novos lançamentos, curvas personalizadas | Taxas dinâmicas |
Notas de Rust
use anchor_lang::prelude::*;
#[account]
pub struct PoolSnapshot {
pub token_a_reserve: u64,
pub token_b_reserve: u64,
pub fee_numerator: u64,
pub fee_denominator: u64,
}
// Sempre leia as reservas no momento da execução - nunca confie em valores de cliente em cache na chainArmadilhas
- Tipo de pool errado - Raydium v4 vs CLMM usam layouts de instrução diferentes. Correção: Combine o SDK/ID do programa com o tipo de pool.
- Array de tick ausente - Swaps Orca precisam de contas de array de tick atuais na lista meta. Correção: Use o SDK Whirlpool para derivar contas restantes.
- Leituras de reserva desatualizadas - A prévia do cliente != preço de execução. Correção: Simule o swap ou leia as reservas no mesmo slot.
- Ordem de mint - Pools armazenam token A/B em ordem canônica. Correção: O sinalizador de direção do swap deve corresponder à ordem dos mints.
- Slippage de LP - Adicionar liquidez pode ser alvo de front-running. Correção: Defina o parâmetro mínimo de tokens LP de saída.
- Volume de conta - Swaps CLMM/DLMM precisam de muitas contas; use ALTs. Correção: Transações versionadas com tabelas de lookup.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Agregador Jupiter | Melhor preço, menos integrações | Você precisa de ações apenas de LP |
| Phoenix CLOB | Livro de ofertas com prioridade de preço-tempo | Você quer rendimento passivo de LP |
| Precificação de oráculo na chain | Colateral de empréstimo | Swaps à vista |
FAQs
Devo integrar o Raydium ou apenas usar o Jupiter?
Use o Jupiter para swaps. Integre o Raydium diretamente para gerenciamento de LP, farming ou caminhos de CPI personalizados.
O que é liquidez concentrada?
LPs depositam em uma faixa de preço (ticks/bins). A eficiência de capital é maior, mas faixas inativas não geram taxas.
Como encontro um endereço de pool?
Use exploradores de locais, routePlan do Jupiter ou helpers getPool do SDK - nunca adivinhe PDAs de pool.
Programas Anchor podem fazer CPI para AMMs?
Sim - passe todas as contas de pool, vault, tick e oráculo necessárias. Valide os IDs do programa em suas restrições.
Como as taxas são cobradas?
Cada swap deduz uma taxa da entrada antes de aplicar o invariante. Os níveis de taxa variam por pool e local.
E os pools Token-2022?
Suporte crescente no Orca/Meteora - verifique a compatibilidade do proprietário do mint e do hook de transferência antes de rotear.
Como testar CPIs de AMM localmente?
Clone as contas do pool no solana-test-validator ou use o fork Surfpool 0.12.0 para reservas realistas.
Por que os bins do Meteora importam?
O preço se move entre os bins; cada bin contém liquidez discreta. Contas de bin ativo incorretas causam falha no swap.
Como calcular o impacto no preço?
Compare o preço à vista antes/depois usando os campos de reserva ou sqrt-price do estado do pool.
Os mapas de rota do Raydium são estáveis?
Os endereços dos pools são estáveis, mas a liquidez migra. Atualize as listas de pools de fontes oficiais periodicamente.
Relacionado
- Swaps com Jupiter - roteamento agregado
- Oráculos - preços para sistemas híbridos de AMM/empréstimo
- Melhores Práticas de Integração DeFi - política de integração de pool
- Testando CPIs e PDAs - testes de CPI de AMM
Versões da Stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, e LiteSVM 0.6.x.