Conceptos básicos de DeFi en Solana
8 ejemplos para empezar con integraciones de DeFi: 5 básicos y 3 intermedios. Cubre swaps, AMM, préstamos, LST, oráculos y flujos CPI componibles en Agave 4.1.1.
Prerrequisitos
- Solana CLI 3.0.10 en devnet para comprobaciones de saldo y tokens.
@solana/kit7.0.0 para ejemplos de clientes TypeScript.- Familiaridad con Conceptos básicos de CPI - la mayoría de las acciones de DeFi son cadenas CPI.
npm install @solana/kit@7.0.0 @solana/spl-tokenEjemplos básicos
1. Leer el saldo de un token antes de un swap
Cada acción de DeFi comienza con saber lo que el usuario posee.
import { createSolanaRpc, address } from "@solana/kit";
import { fetchMint, fetchToken } from "@solana-program/token";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
const owner = address("TU_CLAVE_PUBLICA_DE_CARTERA");
const mint = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); // USDC
const atas = await rpc.getTokenAccountsByOwner(owner, { mint }, { encoding: "jsonParsed" }).send();
console.log(atas.value);- Los saldos residen en cuentas de Token SPL, no directamente en la clave pública de la cartera.
- Resuelve siempre la ATA (cuenta de token asociada) para una mint antes de construir las instrucciones de swap.
- Usa
jsonParsedpara evitar la decodificación manual de diseño en clientes.
Relacionado: Swaps con Jupiter - enrutamiento después de la comprobación de saldo
2. Cotizar un swap a través de la API de Jupiter
Los agregadores devuelven una ruta y bytes de transacción serializados.
const inputMint = "So11111111111111111111111111111111111111112"; // wSOL
const outputMint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; // USDC
const amount = "100000000"; // 0.1 SOL en lamports
const quoteRes = await fetch(
`https://quote-api.jup.ag/v6/quote?inputMint=${inputMint}&outputMint=${outputMint}&amount=${amount}&slippageBps=50`
);
const quote = await quoteRes.json();
console.log(quote.outAmount, quote.routePlan);slippageBpsson puntos base (50 = 0.5%).- La cotización incluye
routePlanque muestra qué tramos de AMM se ejecutan. - Nunca codifiques direcciones de pools fijas - las rutas cambian a medida que la liquidez se desplaza.
Relacionado: AMM (Raydium, Orca, Meteora) - por dónde enruta Jupiter
3. Comprender las matemáticas de las pools de producto constante
Los AMM en Solana utilizan la misma invariante x * y = k que los DEX de EVM, pero el estado reside en cuentas propiedad del programa.
// Salida simplificada de producto constante (comisión omitida)
pub fn amount_out(amount_in: u64, reserve_in: u64, reserve_out: u64) -> u64 {
let numerator = (amount_in as u128) * (reserve_out as u128);
let denominator = (reserve_in as u128) + (amount_in as u128);
(numerator / denominator) as u64
}- Las reservas se leen de las cuentas de pool en la cadena en el momento de la construcción de la transacción.
- Las reservas obsoletas causan transacciones fallidas o malos llenados - actualiza antes de enviar.
- Usa matemáticas verificadas en programas; las previsualizaciones del cliente pueden usar intermedios u128.
Relacionado: AMM (Raydium, Orca, Meteora) - diseños de pools
4. Comprobar un feed de precios de oráculo
Los préstamos y los futuros dependen de precios de oráculos actualizados.
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
// Cuenta del feed de precios SOL/USD de Pyth (mainnet)
const priceAccount = address("H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG");
const account = await rpc.getAccountInfo(priceAccount, { encoding: "base64" }).send();
console.log(account.value?.data);- Las cuentas de oráculo almacenan el precio, la confianza y el slot de publicación.
- Los programas deben comprobar la obsolescencia de
publish_slotfrente a una antigüedad máxima. - Nunca confíes en las lecturas de precios del lado del cliente para la liquidación en cadena.
Relacionado: Oráculos - integración de Pyth y Switchboard
5. Envolver SOL a wSOL para swaps AMM
La mayoría de las pools cotizan contra SOL envuelto, no contra lamports nativos en la cartera.
spl-token wrap 0.5
spl-token accountsspl-token wrapcrea/financia la ATA de wSOL y sincroniza el saldo nativo.- Cierra la ATA de wSOL después de los swaps para recuperar el alquiler si ya no la necesitas.
- Las rutas de Jupiter a menudo manejan wSOL automáticamente, pero las integraciones CPI manuales no deben hacerlo.
Relacionado: Swaps con Jupiter - wSOL en tramos de ruta
Ejemplos intermedios
6. Construir y enviar una transacción de swap de Jupiter
Convierte una cotización en una transacción versionada firmada.
import { createSolanaRpc, createSolanaRpcSubscriptions, address } from "@solana/kit";
import { getBase58Codec } from "@solana/codecs-strings";
const swapRes = await fetch("https://quote-api.jup.ag/v6/swap", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
quoteResponse: quote,
userPublicKey: "TU_CLAVE_PUBLICA_DE_CARTERA",
wrapAndUnwrapSol: true,
dynamicComputeUnitLimit: true,
}),
});
const { swapTransaction } = await swapRes.json();
const txBytes = getBase58Codec().decode(swapTransaction);
// Firma y envía con el firmante de tu carteradynamicComputeUnitLimitsimula el uso de CU y establece un presupuesto seguro.wrapAndUnwrapSolmaneja el ciclo de vida de wSOL para rutas que involucran SOL.- Simula en devnet o Surfpool 0.12.0 antes de la presentación en mainnet.
Relacionado: Mejores prácticas de integraciones DeFi - política de deslizamiento y simulación
7. Componer CPI de préstamos con oráculo de colateral
Los mercados monetarios leen los precios de los oráculos dentro de la instrucción de préstamo.
// Esquema de validación de cuentas estilo Anchor
#[account(
constraint = oracle.key() == market.oracle_pubkey @ ErrorCode::BadOracle,
)]
pub oracle: AccountInfo<'info>,- Los programas de préstamos realizan CPI en programas de oráculo o leen cuentas de oráculo pre-cargadas.
- Las comprobaciones del factor de salud deben usar el mismo precio que utiliza el motor de liquidación.
- Prueba las rutas de obsolescencia de oráculos en LiteSVM 0.6.x antes de mainnet.
Relacionado: Préstamos y Empréstitos - patrones de Kamino y MarginFi
8. Enrutar a través de un LST para rendimiento de staking
Los tokens de staking líquido se negocian como cualquier mint SPL pero representan SOL en staking.
const jitoSolMint = "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn";
// Intercambia SOL -> jitoSOL a través de Jupiter, luego deposita jitoSOL como colateral- Los LST acumulan rendimiento a través de la tasa de cambio, no de saldos que se reajustan.
- Las integraciones deben usar la mint correcta (jitoSOL, mSOL, bSOL) por lista de permitidos del protocolo.
- Las rutas de Sanctum unifican la liquidez de LST entre proveedores.
Relacionado: Staking Líquido (LSTs) - direcciones de mint y tasas
Versiones de la pila: Esta página se escribió 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.