Referência: Um Programa DeFi + dApp
Esta referência de build percorre um pool de empréstimos mínimo: depositar SOL, emitir tokens de participação, sacar com contabilidade pro-rata. Ele une Anchor 0.32.1, testes LiteSVM 0.6.x e um dApp Next.js usando @solana/kit 7.0.0 - a forma como a maioria das equipes de DeFi envia.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
programs/lending/ Programa Anchor (depósito, saque, pausa)
tests/litesvm/ Reprodução de exploração + caminho feliz
app/ Carteira Next.js + simular + enviar
packages/idl/ IDL publicado + tipos de codegen
Quando usar isso:
- Arquitetura de protocolo DeFi Greenfield
- Integração de engenheiro Solana full-stack
- Linha de base do documento de escopo de auditoria
- Comparando seu layout com uma estrutura conhecida e boa
Exemplo de Trabalho
Programa (Trecho do 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 para vault; emitir shares para user_position
Ok(())
}
}
#[account]
pub struct PoolConfig {
pub admin: Pubkey,
pub paused: bool,
pub total_shares: u64,
}Cliente (Trecho do 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);
}Layout do Repositório
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.mdO que isso demonstra:
- Guarda de pausa em todas as instruções mutáveis
- Pacote IDL consumido pelo aplicativo Next.js
- Simulação antes do envio voltado para o usuário
- Slot ADR para política de atualização
Mergulho Profundo
Modelo de Conta
| Conta | Tipo | Propósito |
|---|---|---|
pool_config | PDA | Admin, pausa, totais |
vault | PDA | Contém lamports SOL |
user_position | PDA | Participações por usuário |
Trem de Lançamento
anchor test+ LiteSVM no PR- Implantação em Devnet ao mesclar em
main - Proposta Squads para mainnet com hash verificável
- Promoção do frontend quando a versão do IDL corresponder
Armadilhas
- Matemática do cliente duplica on-chain - Explorações de derivação de preço de participação. Correção: Leia os totais da cadeia; exiba apenas.
- Pausa ausente no saque - Atacante drena durante o incidente. Correção:
require!(!paused)central. - IDL não versionado - O cliente chama instruções removidas. Correção: Semver em
packages/idl. - RPC público no lançamento - Limite de taxa de interrupção. Correção: RPC de escrita dedicado no ambiente de produção.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Pinocchio para ix quente | CU comprovadamente gargalo | Primeira versão |
| Repositório de cliente separado | Múltiplos consumidores | Sobrecarga de equipe pequena |
| Programa imutável | Pool simples fixo | Precisa de correções pós-auditoria |
FAQs
Por que Anchor e não Pinocchio aqui?
Velocidade e familiaridade com auditoria superam as economias de CU até que sejam perfiladas.
Onde o Jupiter se encaixa?
Módulo CPI separado; ID do programa na lista de permissões nas constantes.
Indexador necessário?
Para gráficos de histórico sim; MVP pode consultar PDAs via RPC.
Papel do validador de teste?
Depuração manual; CI usa LiteSVM de acordo com os pinos do manifesto.
Celular?
Adicione o caminho MWA no aplicativo; mesmo pacote de cliente IDL.
Tokens de participação SPL?
Sim - autoridade de emissão = PDA do pool; veja a referência de lançamento de token SPL.
Política de atualização?
Documentado em ADR; Squads 2 de 3 antes do TVL da mainnet.
Quão pequeno isso pode ser?
Esta referência tem um tamanho ensinável; a produção adiciona oráculos, liquidações, eventos.
Pacote de auditoria?
Programa + IDL + este documento de arquitetura + apêndice de modelo de ameaça.
Clonar repositório?
Use como modelo; substitua o ID do programa e gere novos pares de chaves por ambiente.
Relacionado
- Referência: Um Lançamento de Token SPL - mint do token de participação
- Antes/Depois: Otimizando CU e Aluguel - caminho de escala
- Noções básicas do Anchor - fundamentos do framework
Versões da Stack: Esta página foi 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 e LiteSVM 0.6.x.