Swaps com Jupiter
O Jupiter agrega liquidez entre Raydium, Orca, Meteora e outros AMMs Solana em uma única API de swap. Use-o quando precisar de roteamento de melhor preço sem manter os gráficos de pool você mesmo.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
const quote = await fetch(
`https://quote-api.jup.ag/v6/quote?inputMint=${inMint}&outputMint=${outMint}&amount=${amount}&slippageBps=50`
).then((r) => r.json());
const swap = await fetch("https://quote-api.jup.ag/v6/swap", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ quoteResponse: quote, userPublicKey: wallet, wrapAndUnwrapSol: true }),
}).then((r) => r.json());Quando usar isso:
- Construindo uma interface de swap de carteira sem curadoria de listas de pools.
- Rebalanceamento de tesourarias entre tokens SPL no backend.
- Roteamento através de múltiplos saltos de AMM em uma única transação.
- Obtendo transações serializadas para signatários do
@solana/kit7.0.0.
Exemplo de Trabalho
import { createSolanaRpc, address, lamports } from "@solana/kit";
import { getBase58Codec } from "@solana/codecs-strings";
const RPC = "https://api.mainnet-beta.solana.com";
const rpc = createSolanaRpc(RPC);
const inputMint = "So11111111111111111111111111111111111111112";
const outputMint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
const amount = "50000000"; // 0.05 SOL
const slippageBps = 50;
const userPublicKey = "YOUR_WALLET_PUBKEY";
const quote = await fetch(
`https://quote-api.jup.ag/v6/quote?inputMint=${inputMint}&outputMint=${outputMint}&amount=${amount}&slippageBps=${slippageBps}`
).then((r) => r.json());
const { swapTransaction } = await fetch("https://quote-api.jup.ag/v6/swap", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
quoteResponse: quote,
userPublicKey,
wrapAndUnwrapSol: true,
dynamicComputeUnitLimit: true,
prioritizationFeeLamports: "auto",
}),
}).then((r) => r.json());
const txBytes = getBase58Codec().decode(swapTransaction);
// Assine txBytes com a carteira, envie via rpc.sendTransaction(...)
console.log("Saída esperada:", quote.outAmount);O que isso demonstra:
- A API de cotação retorna
outAmount,priceImpactPcteroutePlan. - A API de swap retorna uma transação versionada codificada em base58 pronta para assinar.
dynamicComputeUnitLimiteprioritizationFeeLamportsajustam o pouso no Agave 4.1.1.
Mergulho Profundo
Como Funciona
- O roteador do Jupiter escaneia o estado atual do pool e constrói uma rota de múltiplos saltos.
- A transação de swap agrupa CPIs em cada programa AMM na ordem da rota.
- Contas de token, encapsulamento/desencapsulamento de wSOL e ATAs são tratados na lista de instruções.
- Transações versionadas podem incluir tabelas de lookup de endereços para compressão de contas.
Superfície da API do Jupiter
| Endpoint | Propósito | Parâmetros chave |
|---|---|---|
/v6/quote | Rota de preço | inputMint, outputMint, amount, slippageBps |
/v6/swap | Construir tx | quoteResponse, userPublicKey |
/v6/swap-instructions | Lista bruta de instruções | Para montagem personalizada de tx |
Notas de TypeScript
// Atualiza a cota se o blockhash envelhecer - as cotas expiram rapidamente
const MAX_QUOTE_AGE_MS = 30_000;
const quotedAt = Date.now();
// Re-cota antes de enviar se Date.now() - quotedAt > MAX_QUOTE_AGE_MSArmadilhas
- Cotas desatualizadas - Rotas invalidam à medida que as reservas se movem. Correção: Reobtenha a cota imediatamente antes do
swape defina uma janela de idade máxima. - Slippage muito baixo - Pares voláteis falham com
SlippageToleranceExceeded. Correção: AumenteslippageBpsou divida em swaps menores. - ATA ausente - A conta de token de saída pode não existir. Correção: Habilite as opções
createAtaou pré-crie o ATA em uma tx de configuração. - Confusão de wSOL - SOL nativo e wSOL são mints diferentes. Correção: Use
wrapAndUnwrapSol: trueou gerencie o ATA de wSOL explicitamente. - Orçamento de computação - Rotas de múltiplos saltos excedem o limite padrão de 200k CU. Correção: Use
dynamicComputeUnitLimit: true. - Pools apenas em Mainnet - Devnet tem liquidez fina. Correção: Teste o roteamento em um fork da mainnet via Surfpool 0.12.0, não em devnet puro.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| CPI Direta de AMM | Você controla o pool + quer dependências mínimas | Você precisa do melhor preço entre os locais |
| Instruções de swap do Jupiter | Tx personalizada com suas próprias ALTs | Você quer o caminho mais rápido para um swap funcional |
| CPI do programa Jupiter on-chain | Swap dentro do seu programa Anchor | Você precisa apenas de descoberta de rota off-chain |
FAQs
Qual slippage devo usar como padrão?
Comece com 50 bps (0,5%) para pares líquidos. Aumente para 100-300 bps para pools finos ou lançamentos voláteis.
Posso fazer swap dentro de um programa on-chain?
Sim - faça CPI no programa on-chain do Jupiter com contas de swap-instructions. O roteamento off-chain ainda descobre o caminho.
Como lidar com taxas de prioridade?
Passe prioritizationFeeLamports: "auto" na solicitação de swap, ou defina um valor explícito de lamports do seu oráculo de taxas.
O Jupiter suporta swaps com valor exato de saída?
Use swapMode=ExactOut no endpoint de cota quando precisar de uma quantidade de saída precisa (por exemplo, para pagar uma dívida exata).
Por que meu swap simulou bem, mas falhou on-chain?
Cota desatualizada, contenção de bloqueio de conta ou taxa de prioridade muito baixa. Re-cota e aumente CU/taxa de prioridade.
Posso restringir quais DEXes o Jupiter usa?
Sim - passe listas de permissão/negação dexes na API de cotação para excluir locais não confiáveis.
Como registrar a rota para depuração?
Inspecione quote.routePlan - cada etapa mostra swapInfo com o rótulo AMM, quantidades de entrada/saída e endereço do pool.
A API de cotação tem limite de taxa?
Tráfego intenso do servidor deve cachear cotações brevemente e fazer backoff em HTTP 429. Considere os planos pagos do Jupiter para produção.
Como testar sem SOL da mainnet?
Use o fork da mainnet do Surfpool 0.12.0 com carteiras de teste financiadas, ou devnet com mints de pool conhecidos (rotas limitadas).
Qual programa de token o Jupiter espera?
Mints Token-2022 são suportados em muitas rotas, mas não em todos os pools. Verifique os IDs do programa de token routePlan por perna.
Relacionado
- Noções Básicas de DeFi na Solana - visão geral de composabilidade
- AMMs (Raydium, Orca, Meteora) - locais pelos quais o Jupiter roteia
- Jito & MEV - pousando swaps sob contenção
- Melhores Práticas de Integrações DeFi - política de swap de produção
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.