Referencia: Un Programa DeFi + dApp
Esta compilación de referencia recorre un pool de préstamos mínimo: depositar SOL, emitir tokens de participación, retirar con contabilidad pro-rata. Vincula Anchor 0.32.1, pruebas LiteSVM 0.6.x y una dApp Next.js que utiliza @solana/kit 7.0.0: la forma en que la mayoría de los equipos de DeFi envían sus productos.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
programs/lending/ Programa Anchor (depositar, retirar, pausar)
tests/litesvm/ Reproducción de exploits + camino feliz
app/ Wallet Next.js + simular + enviar
packages/idl/ IDL publicado + tipos de codegen
Cuándo recurrir a esto:
- Arquitectura de protocolo DeFi Greenfield
- Incorporación de ingeniero de Solana full-stack
- Línea base del documento de alcance de auditoría
- Comparación de tu diseño con una estructura conocida y buena
Ejemplo de trabajo
Programa (extracto de Anchor 0.32.1)
use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod lending {
use super::*;
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
require!(!ctx.accounts.config.paused, LendingError::Paused);
// transferir SOL a la bóveda; emitir acciones al user_position
Ok(())
}
}
#[account]
pub struct PoolConfig {
pub admin: Pubkey,
pub paused: bool,
pub total_shares: u64,
}Cliente (extracto de TypeScript)
import { createSolanaRpc } from "@solana/kit";
import { buildDepositIx } from "@lending/idl-client";
const rpc = createSolanaRpc(process.env.NEXT_PUBLIC_RPC_URL!);
export async function deposit(amount: bigint, wallet: Wallet) {
const ix = await buildDepositIx({ amount, user: wallet.publicKey });
const sim = await rpc.simulateTransaction(await wallet.sign(ix), { sigVerify: true }).send();
if (sim.value.err) throw new Error(JSON.stringify(sim.value.err));
return wallet.send(ix);
}Diseño del repositorio
lending-reference/
programs/lending/src/lib.rs
tests/litesvm/deposit_withdraw.rs
app/src/app/pool/page.tsx
packages/idl/lending.json
docs/adr/0001-upgradeable-pool.mdLo que esto demuestra:
- Guardia de pausa en todas las instrucciones mutables
- Paquete IDL consumido por la aplicación Next.js
- Simulación antes del envío al usuario
- Espacio ADR para la política de actualización
Análisis Profundo
Modelo de Cuenta
| Cuenta | Tipo | Propósito |
|---|---|---|
pool_config | PDA | Administrador, pausa, totales |
vault | PDA | Contiene lamports de SOL |
user_position | PDA | Acciones por usuario |
Tren de Lanzamiento
anchor test+ LiteSVM en PR- Despliegue en Devnet al fusionar en
main - Propuesta de Squads para mainnet con hash verificable
- Promoción del frontend cuando la versión de IDL coincida
Errores comunes
- Las matemáticas del cliente duplican las de la cadena - Exploits de deriva del precio de las acciones. Solución: Leer totales de la cadena; mostrar solo.
- Pausa faltante en el retiro - El atacante drena durante un incidente. Solución:
require!(!paused)centralizado. - IDL no versionado - El cliente llama a ix eliminadas. Solución: Semver en
packages/idl. - RPC público al lanzar - Interrupción por límite de tasa. Solución: RPC de escritura dedicado en el entorno de producción.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| Pinocchio para ix de alta carga | CU probada como cuello de botella | Primera versión |
| Repositorio de cliente separado | Múltiples consumidores | Sobrecarga de equipo pequeño |
| Programa inmutable | Pool simple fijo | Necesidad de correcciones post-auditoría |
Preguntas Frecuentes
¿Por qué Anchor y no Pinocchio aquí?
La velocidad y la familiaridad con la auditoría superan los ahorros de CU hasta que se perfila.
¿Dónde encaja Jupiter?
Módulo CPI separado; ID de programa en lista blanca en las constantes.
¿Se necesita indexador?
Para gráficos históricos sí; el MVP puede consultar PDAs a través de RPC.
¿Rol del validador de pruebas?
Depuración manual; CI usa LiteSVM según los pines del manifiesto.
¿Móvil?
Agregar ruta MWA en la aplicación; mismo paquete de cliente IDL.
¿Tokens de participación SPL?
Sí - autoridad de emisión = PDA del pool; ver referencia de lanzamiento de tokens SPL.
¿Política de actualización?
Documentado en ADR; Squads 2 de 3 antes del TVL de mainnet.
¿Qué tan pequeño puede ser esto?
Esta referencia tiene un tamaño enseñable; la producción agrega oráculos, liquidaciones, eventos.
¿Paquete de auditoría?
Programa + IDL + este documento de arquitectura + apéndice de modelo de amenazas.
¿Clonar repositorio?
Usar como plantilla; reemplazar el ID del programa y regenerar los pares de claves por entorno.
Relacionado
- Referencia: Un Lanzamiento de Token SPL - emisión de token de participación
- Antes/Después: Optimización de CU y Alquiler - ruta de escala
- Fundamentos de Anchor - fundamentos del framework
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.