Noções Básicas de DeFi na Solana
8 exemplos para você começar com integrações DeFi - 5 básicos e 3 intermediários. Abrange swaps, AMMs, empréstimos, LSTs, oráculos e fluxos de CPI compósitos no Agave 4.1.1.
Pré-requisitos
- Solana CLI 3.0.10 em devnet para verificações de saldo e token.
@solana/kit7.0.0 para exemplos de cliente TypeScript.- Familiaridade com Noções Básicas de CPI - a maioria das ações DeFi são cadeias de CPI.
npm install @solana/kit@7.0.0 @solana/spl-tokenExemplos Básicos
1. Ler um Saldo de Token Antes de um Swap
Toda ação DeFi começa sabendo o que o usuário possui.
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("SUA_CHAVE_PUBLICA_DA_CARTEIRA");
const mint = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); // USDC
const atas = await rpc.getTokenAccountsByOwner(owner, { mint }, { encoding: "jsonParsed" }).send();
console.log(atas.value);- Saldos vivem em contas SPL Token, não diretamente na chave pública da carteira.
- Sempre resolva a ATA (conta de token associada) para um mint antes de construir instruções de swap.
- Use
jsonParsedpara evitar decodificação manual de layout em clientes.
Relacionado: Swaps com Jupiter - roteamento após verificação de saldo
2. Citar um Swap via API Jupiter
Agregadores retornam uma rota e bytes de transação serializados.
const inputMint = "So11111111111111111111111111111111111111112"; // wSOL
const outputMint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; // USDC
const amount = "100000000"; // 0.1 SOL em 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);slippageBpssão basis points (50 = 0.5%).- A cotação inclui
routePlanmostrando quais "pernas" de AMM são executadas. - Nunca codifique endereços de pool diretamente - rotas mudam conforme a liquidez se move.
Relacionado: AMMs (Raydium, Orca, Meteora) - o que Jupiter roteia
3. Entender a Matemática do Pool de Produto Constante
AMMs na Solana usam a mesma invariante x * y = k que DEXes EVM, mas o estado vive em contas de propriedade do programa.
// Saída simplificada de produto constante (taxa 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
}- Reservas são lidas de contas de pool on-chain no momento da construção da transação.
- Reservas desatualizadas causam transações falhas ou preenchimentos ruins - atualize antes de enviar.
- Use matemática verificada em programas; prévias do cliente podem usar intermediários u128.
Relacionado: AMMs (Raydium, Orca, Meteora) - layouts de pool
4. Verificar um Feed de Preço de Oráculo
Empréstimos e futuros dependem de preços de oráculos atualizados.
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
// Conta de feed de preço SOL/USD do Pyth (mainnet)
const priceAccount = address("H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG");
const account = await rpc.getAccountInfo(priceAccount, { encoding: "base64" }).send();
console.log(account.value?.data);- Contas de oráculo armazenam preço, confiança e slot de publicação.
- Programas devem verificar a atualidade do
publish_slotcontra uma idade máxima. - Nunca confie em leituras de preço do lado do cliente para liquidação on-chain.
Relacionado: Oráculos - integração Pyth e Switchboard
5. Envolver SOL para wSOL para Swaps AMM
A maioria dos pools cotam contra SOL "envolvido" (wrapped), não lamports nativos na carteira.
spl-token wrap 0.5
spl-token accountsspl-token wrapcria/financia a ATA de wSOL e sincroniza o saldo nativo.- Feche a ATA de wSOL após os swaps para recuperar o aluguel (rent) se não precisar mais dela.
- Rotas Jupiter frequentemente lidam com wSOL automaticamente, mas integrações CPI manuais não devem.
Relacionado: Swaps com Jupiter - wSOL em pernas de rota
Exemplos Intermediários
6. Construir e Enviar uma Transação de Swap Jupiter
Transforme uma cotação em uma transação versionada assinada.
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: "SUA_CHAVE_PUBLICA_DA_CARTEIRA",
wrapAndUnwrapSol: true,
dynamicComputeUnitLimit: true,
}),
});
const { swapTransaction } = await swapRes.json();
const txBytes = getBase58Codec().decode(swapTransaction);
// Assine e envie com o signatário da sua carteiradynamicComputeUnitLimitsimula o uso de CU e define um limite seguro.wrapAndUnwrapSollida com o ciclo de vida do wSOL para rotas envolvendo SOL.- Simule em devnet ou Surfpool 0.12.0 antes da submissão para mainnet.
Relacionado: Melhores Práticas de Integrações DeFi - política de slippage e simulação
7. Compor CPI de Empréstimo com Oráculo de Colateral
Mercados de empréstimo leem preços de oráculos dentro da instrução de empréstimo.
// Esboço de validação de conta estilo Anchor
#[account(
constraint = oracle.key() == market.oracle_pubkey @ ErrorCode::BadOracle,
)]
pub oracle: AccountInfo<'info>,- Programas de empréstimo fazem CPI para programas de oráculo ou leem contas de oráculo pré-carregadas.
- Verificações de fator de saúde devem usar o mesmo preço que o motor de liquidação usa.
- Teste caminhos de atualidade de oráculo em LiteSVM 0.6.x antes de mainnet.
Relacionado: Empréstimos e Financiamentos - padrões Kamino e MarginFi
8. Roteamento via LST para Rendimento de Staking
Tokens de staking líquido são negociados como qualquer mint SPL, mas representam SOL "staked".
const jitoSolMint = "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn";
// Troque SOL -> jitoSOL via Jupiter, depois deposite jitoSOL como colateral- LSTs acumulam rendimento através da taxa de câmbio, não por saldos que reagem (rebasing).
- Integrações devem usar o mint correto (jitoSOL, mSOL, bSOL) por lista de permissões do protocolo.
- Rotas Sanctum unificam a liquidez de LST entre provedores.
Relacionado: Staking Líquido (LSTs) - endereços de mint e taxas
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.