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:
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:
"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:
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:
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.
Acompanhe mais artigos de André Dias Moreira Prol no Medium.
Top comments (0)