Vault & Escrow
Los vaults y escrows custodian SOL o tokens SPL bajo la autoridad de un PDA hasta que las reglas del programa los liberen. Los patrones correctos validan las partes, usan "bumps" canónicos y aplican la secuencia de verificaciones-efectos-interacciones antes de las CPI.
Receta
// Custodiar: depósito CPI de token a ATA del vault propiedad del PDA del vault
// Liberar: verificar condiciones -> invocar_signed transferencia salienteCuándo usar esto:
- Escrow de marketplace.
- Staking o bloqueo de tokens.
- Vaults de tesorería de protocolos.
Ejemplo de Trabajo
pub fn release(bump: u8, escrow_auth: &AccountInfo, source: &AccountInfo, dest: &AccountInfo, token_program: &AccountInfo, amount: u64) -> ProgramResult {
// 1. verificar estado del escrow: Abierto y expiración
// 2. marcar como Lleno en los datos de la cuenta ANTES de la CPI
let ix = spl_token::instruction::transfer(token_program.key, source.key, dest.key, escrow_auth.key, &[], amount)?;
invoke_signed(&ix, &[source.clone(), dest.clone(), escrow_auth.clone(), token_program.clone()], &[&[b"escrow", &[bump]]])
}Lo que esto demuestra:
- Estado actualizado antes de la CPI de tokens.
- La autoridad PDA firma la transferencia.
- Monto validado contra el registro del escrow.
Análisis Profundo
SOL vs SPL
SOL: transferencia del sistema + lamports del PDA. SPL: cuenta de token + verificaciones de "mint".
ATA
Usa direcciones de token asociadas para los usuarios.
Notas de Rust
// Verificar que el mint coincida con las cuentas de token de origen/destino.Trampas Comunes
- Liberar antes de actualizar el estado - Doble pago por reentrada. Solución: Orden CEI.
- PDA de vault global compartido - Un error agota todo. Solución: "Seeds" por usuario.
- Mint incorrecto - Robar tipo de token equivocado. Solución: Desempaquetar campo "mint".
- Escrow sin cancelación - Fondos bloqueados. Solución: Ruta de cancelación por tiempo límite.
- Autoridad no verificada por PDA - Falsificador de firma de escrow. Solución: Derivar y comparar PDA.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Programa de escrow de terceros | Probado en batalla | Componibilidad |
| Multisig de billetera | Custodia humana | Automatización |
| Bloqueos nativos Lightning/SOL | Pila diferente | N/A |
Preguntas Frecuentes
¿Escrow de SOL?
El PDA custodia los lamports.
¿Liberación parcial?
Soportado con estado.
¿Comisiones en la liberación?
Dividir en la misma ix.
¿Cerrar escrow?
Devolver el alquiler después de vaciar.
¿Escrow de NFT?
Añadir verificaciones de metadatos.
¿Ejemplos de escrow con Anchor?
Estudiar las restricciones.
¿Quién cancela?
Comprador/vendedor/administrador según reglas.
¿Bloqueo de tiempo?
Sysvar de reloj.
¿Auditoría?
Crítico.
¿Token-2022?
ID de programa correcto.
¿Surfpool?
Prueba de flujo completo.
¿Seguro?
Riesgo del protocolo separado.
Relacionado
- PDAs como Autoridades - Autoridad
- CPI a SPL Token - Transferencias
- Reentrancy y Seguridad - Ordenamiento
Versiones de la pila: 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.