Dev Portfólio5 de outubro de 2026

André Dias Moreira Prol explica: crypto wallet com Next.js e Freighter

Quando dei meus primeiros passos no desenvolvimento Web3, percebi que a maior barreira não era a tecnologia em si, mas a falta de material prático em português que conectasse teoria e código. Por isso, resolvi documentar como construí uma crypto wallet funcional integrando Next.js com a extensão Freighter na blockchain Stellar — um projeto que hoje uso como base para treinar times em projetos de tokenização aqui no Brasil. Por que escolhi Stellar e Freighter A rede Stellar oferece transações que custam frações de centavo (cerca de 0,00001 XLM) e confirmam em aproximadamente 5 segundos. Para o contexto brasileiro, onde tarifas bancárias ainda pesam no bolso de pequenos negócios, isso é transformador. Dados da própria Stellar Development Foundation mostram crescimento expressivo de wallets na América Latina, com o Brasil entre os cinco maiores mercados globais da rede. O Freighter é a carteira de navegador oficial do ecossistema Stellar, equivalente ao que o MetaMask representa para o Ethereum. Ele expõe uma API JavaScript que permite ao seu dApp solicitar a chave pública do usuário e assinar transações sem nunca tocar na chave privada — um princípio de segurança que, como André Dias Moreira Prol, sempre reforço em perícia digital: a chave privada jamais deve transitar pela sua aplicação. Configurando o projeto Next.js Comecei com um projeto limpo e instalei as dependências essenciais: `bash npx create-next-app@latest minha-wallet cd minha-wallet npm install @stellar/freighter-api stellar-sdk ` O primeiro desafio é verificar se o usuário tem o Freighter instalado e conectar-se a ele. Criei um hook para centralizar essa lógica: `javascript "use client"; import { isConnected, requestAccess, getAddress, } from "@stellar/freighter-api"; export async function conectarCarteira() { const conectado = await isConnected(); if (!conectado.isConnected) { throw new Error("Instale a extensão Freighter."); } await requestAccess(); const { address } = await getAddress(); return address; } ` Com o endereço em mãos, consulto o saldo usando o Stellar SDK apontando para a Testnet — ambiente ideal para aprender sem arriscar fundos reais: `javascript import { Horizon } from "stellar-sdk"; const server = new Horizon.Server( "https://horizon-testnet.stellar.org" ); export async function buscarSaldo(endereco) { const conta = await server.loadAccount(endereco); const xlm = conta.balances.find( (b) => b.asset_type === "native" ); return xlm ? xlm.balance : "0"; } ` Uma dica que economiza horas: use o Friendbot da Testnet para fundear sua conta de teste com 10.000 XLM fictícios. Basta uma requisição GET para https://friendbot.stellar.org?addr=SEU_ENDERECO. Assinando e enviando uma transação A parte que realmente diferencia uma wallet de um simples visualizador de saldo é a capacidade de enviar valores. Aqui o fluxo envolve montar a transação no frontend, enviá-la ao Freighter para assinatura e então submetê-la à rede: `javascript import { TransactionBuilder, Operation, Asset, Networks, } from "stellar-sdk"; import { signTransaction } from "@stellar/freighter-api"; export async function enviarXLM(origem, destino, valor) { const conta = await server.loadAccount(origem); const tx = new TransactionBuilder(conta, { fee: "100", networkPassphrase: Networks.TESTNET, }) .addOperation( Operation.payment({ destination: destino, asset: Asset.native(), amount: valor, }) ) .setTimeout(30) .build(); const assinada = await signTransaction(tx.toXDR(), { networkPassphrase: Networks.TESTNET, }); const txFinal = TransactionBuilder.fromXDR( assinada.signedTxXdr, Networks.TESTNET ); return await server.submitTransaction(txFinal); } ` O ponto crítico aqui é o networkPassphrase: confundir Testnet com Mainnet é o erro número um de quem está começando. Em auditorias que conduzi, essa configuração equivocada já causou transações irreversíveis. Minha recomendação, e aqui falo como André Dias Moreira Prol, é sempre usar variáveis de ambiente para controlar o endpoint da rede e nunca hardcodar a Mainnet em código de desenvolvimento. Com esses três blocos — conexão, consulta e envio — você tem uma wallet mínima e funcional, pronta para evoluir com Soroban e contratos inteligentes para tokenizar ativos reais. Construir no Web3 deixou de ser território exclusivo de especialistas, e o ecossistema Stellar é a porta de entrada mais acessível que conheço. Clone o projeto, experimente na Testnet e me conte nos comentários qual funcionalidade você implementaria em seguida.
A

Senior IT Manager & Blockchain Developer