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.
Busca en todas las páginas de la documentación
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.
@solana/kit 7.0.0 para ejemplos de clientes TypeScript.npm install @solana/kit@7.0.0 @solana/spl-tokenCada 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);jsonParsed para evitar la decodificación manual de diseño en clientes.Relacionado: Swaps con Jupiter - enrutamiento después de la comprobación de saldo
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);slippageBps son puntos base (50 = 0.5%).routePlan que muestra qué tramos de AMM se ejecutan.Relacionado: AMM (Raydium, Orca, Meteora) - por dónde enruta Jupiter
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
}Relacionado: AMM (Raydium, Orca, Meteora) - diseños de pools
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);publish_slot frente a una antigüedad máxima.Relacionado: Oráculos - integración de Pyth y Switchboard
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 wrap crea/financia la ATA de wSOL y sincroniza el saldo nativo.Relacionado: Swaps con Jupiter - wSOL en tramos de ruta
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 carteradynamicComputeUnitLimit simula el uso de CU y establece un presupuesto seguro.wrapAndUnwrapSol maneja el ciclo de vida de wSOL para rutas que involucran SOL.Relacionado: Mejores prácticas de integraciones DeFi - política de deslizamiento y simulación
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>,Relacionado: Préstamos y Empréstitos - patrones de Kamino y MarginFi
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 colateralRelacionado: 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.
Revisado por Chris St. John·Última actualización: 16 jul 2026