Intercambios con Jupiter
Jupiter agrega liquidez a través de Raydium, Orca, Meteora y otros AMM de Solana en una única API de intercambio. Úsala cuando necesites enrutamiento al mejor precio sin mantener tú mismo los gráficos de pools.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
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());Cuándo recurrir a esto:
- Construir una interfaz de usuario de intercambio de billetera sin curar listas de pools.
- Reequilibrar tesorerías en tokens SPL en el backend.
- Enrutar a través de múltiples saltos de AMM en una sola transacción.
- Obtener transacciones serializadas para los firmantes de
@solana/kit7.0.0.
Ejemplo de trabajo
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);
// Firma txBytes con la billetera, envía a través de rpc.sendTransaction(...)
console.log("Salida esperada:", quote.outAmount);Lo que esto demuestra:
- La API de cotización devuelve
outAmount,priceImpactPctyroutePlan. - La API de intercambio devuelve una transacción versionada codificada en base58 lista para firmar.
dynamicComputeUnitLimityprioritizationFeeLamportsajustan el aterrizaje en Agave 4.1.1.
Análisis Profundo
Cómo Funciona
- El enrutador de Jupiter escanea el estado en vivo de los pools y construye una ruta de múltiples saltos.
- La transacción de intercambio agrupa las CPI en cada programa AMM en orden de ruta.
- Las cuentas de tokens, el envoltorio/desenvoltorio de wSOL y las ATAs se manejan en la lista de instrucciones.
- Las transacciones versionadas pueden incluir tablas de búsqueda de direcciones para la compresión de cuentas.
Superficie de la API de Jupiter
| Endpoint | Propósito | Parámetros clave |
|---|---|---|
/v6/quote | Ruta de precios | inputMint, outputMint, amount, slippageBps |
/v6/swap | Construir tx | quoteResponse, userPublicKey |
/v6/swap-instructions | Lista de ix sin procesar | Para ensamblaje de tx personalizado |
Notas de TypeScript
// Actualiza la cotización si el hash del bloque envejece - las cotizaciones caducan rápidamente
const MAX_QUOTE_AGE_MS = 30_000;
const quotedAt = Date.now();
// Vuelve a cotizar antes de enviar si Date.now() - quotedAt > MAX_QUOTE_AGE_MSTrampas
- Cotizaciones obsoletas - Las rutas se invalidan a medida que las reservas se mueven. Solución: Vuelve a obtener la cotización inmediatamente antes de
swapy establece una ventana de edad máxima. - Deslizamiento demasiado bajo - Los pares volátiles fallan con
SlippageToleranceExceeded. Solución: AumentaslippageBpso divídelo en intercambios más pequeños. - ATA faltante - La cuenta de token de salida puede no existir. Solución: Habilita las opciones
createAtao pre-crea la ATA en una transacción de configuración. - Confusión de wSOL - SOL nativo y wSOL son diferentes acuñaciones. Solución: Usa
wrapAndUnwrapSol: trueo gestiona la ATA de wSOL explícitamente. - Presupuesto de cómputo - Las rutas de múltiples saltos exceden el límite predeterminado de 200k CU. Solución: Usa
dynamicComputeUnitLimit: true. - Pools solo para Mainnet - Devnet tiene liquidez escasa. Solución: Prueba el enrutamiento en una bifurcación de mainnet a través de Surfpool 0.12.0, no en devnet sin procesar.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| CPI directa de AMM | Controlas el pool + quieres dependencias mínimas | Necesitas el mejor precio en varios lugares |
swap-instructions de Jupiter | Tx personalizada con tus propias ALT | Quieres la ruta más rápida a un intercambio funcional |
| CPI del programa Jupiter en cadena | Intercambiar dentro de tu programa Anchor | Solo necesitas descubrimiento de rutas fuera de cadena |
Preguntas Frecuentes
¿Qué deslizamiento debo usar por defecto?
Comienza con 50 bps (0.5%) para pares líquidos. Aumenta a 100-300 bps para pools delgados o lanzamientos volátiles.
¿Puedo intercambiar dentro de un programa en cadena?
Sí, haz CPI al programa en cadena de Jupiter con cuentas de swap-instructions. El enrutamiento fuera de cadena todavía descubre la ruta.
¿Cómo manejo las tarifas de prioridad?
Pasa prioritizationFeeLamports: "auto" en la solicitud de intercambio, o establece un valor explícito de lamports de tu oráculo de tarifas.
¿Jupiter soporta intercambios de salida exacta?
Usa swapMode=ExactOut en el endpoint de cotización cuando necesites una cantidad de salida precisa (por ejemplo, para pagar una deuda exacta).
¿Por qué mi intercambio se simuló bien pero falló en cadena?
Cotización obsoleta, contención de bloqueo de cuenta o tarifa de prioridad demasiado baja. Vuelve a cotizar y aumenta la CU/tarifa de prioridad.
¿Puedo restringir qué DEX usa Jupiter?
Sí, pasa listas de inclusión/exclusión dexes en la API de cotización para excluir lugares no confiables.
¿Cómo registro la ruta para depuración?
Inspecciona quote.routePlan - cada paso muestra swapInfo con la etiqueta AMM, cantidades de entrada/salida y la dirección del pool.
¿La API de cotización tiene límites de tasa?
El tráfico pesado del servidor debería almacenar en caché las cotizaciones brevemente y retroceder en caso de HTTP 429. Considera los niveles de pago de Jupiter para producción.
¿Cómo pruebo sin SOL de mainnet?
Usa la bifurcación de mainnet de Surfpool 0.12.0 con billeteras de prueba financiadas, o devnet con acuñaciones de pool conocidas (rutas limitadas).
¿Qué programa de tokens espera Jupiter?
Las acuñaciones Token-2022 son compatibles en muchas rutas, pero no en todos los pools. Verifica los IDs del programa de tokens de routePlan por tramo.
Relacionado
- Fundamentos de DeFi en Solana - descripción general de la componibilidad
- AMMs (Raydium, Orca, Meteora) - lugares a través de los cuales enruta Jupiter
- Jito y MEV - aterrizaje de intercambios bajo contención
- Mejores Prácticas de Integraciones DeFi - política de intercambios en producción
Versiones de Stack: Esta página fue 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, y LiteSVM 0.6.x.