Una aplicación descentralizada (dApp) para interactuar con assets nativos en la blockchain de Stellar, construida con Next.js, TypeScript y Freighter wallet.
- 🔐 Conexión con Freighter Wallet: Autenticación segura sin backend
- ✅ Creación de Trustlines: Autoriza tu cuenta para recibir stablecoins (USDC)
- 💰 Consulta de Balances: Visualiza tus holdings de assets nativos
- 💸 Path Payments (Avanzado): Convierte assets automáticamente usando el DEX de Stellar
- 🎨 UI Moderna: Interfaz intuitiva con Tailwind CSS
- 📊 Persistencia de Datos: Registro de transacciones en Supabase
- Framework: Next.js 14 (App Router)
- Lenguaje: TypeScript
- Blockchain: Stellar SDK
- Wallet: Freighter API
- Base de Datos: Supabase
- Estilos: Tailwind CSS
- Node.js 18+ instalado
- Freighter Wallet instalada en tu navegador
- Cuenta de Supabase (plan gratuito)
- Clona el repositorio
git clone <tu-repo>
cd stellar-native-assets-dapp- Instala dependencias
npm install- Configura variables de entorno
Crea un archivo .env.local en la raíz del proyecto:
# .env.local
# ⚠️ CRÍTICO: NO SUBAS ESTE ARCHIVO A GITHUB
NEXT_PUBLIC_SUPABASE_URL=https://xxxxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGc...- Verifica el .gitignore
Asegúrate que .env.local esté en tu .gitignore:
# .gitignore
.env.local
.env*.local- Inicia el servidor de desarrollo
npm run devAbre http://localhost:3000 en tu navegador.
NUNCA subas .env.local a GitHub.
- ❌ Borra el archivo del repositorio
- 🔄 Regenera las keys en Supabase (Settings → API)
- ✅ Actualiza
.env.localcon las nuevas keys - 🔒 Verifica que
.gitignoreincluya.env.local
src/
├── app/
│ └── page.tsx # Página principal
├── components/
│ ├── WalletConnect.tsx # Conexión con Freighter
│ ├── CreateTrustline.tsx # Crear trustlines
│ ├── AssetBalance.tsx # Ver balances
│ ├── PathPayment.tsx # Pagos con conversión (Avanzado)
│ └── Spinner.tsx # Indicador de carga
├── lib/
│ ├── constants.ts # Assets y URLs de Horizon
│ └── supabase.ts # Cliente de Supabase
└── types/
└── stellar.ts # Tipos TypeScript
// ❌ Antes (JSX)
import { Server } from 'stellar-sdk';
// ✅ Ahora (TSX)
import { Horizon } from "@stellar/stellar-sdk";
const server = new Horizon.Server(HORIZON_URLS.testnet);Ahora usa la API de Freighter correctamente con imports dinámicos:
const freighter = await import("@stellar/freighter-api");
const connected = await freighter.isConnected();
const accessResult = await freighter.requestAccess();
const addressResult = await freighter.getAddress();- ✅ Props tipadas con interfaces
- ✅ Estados con tipos explícitos (
useState<string>("")) - ✅ Funciones con tipos de retorno (
: Promise<void>) - ✅ Manejo de errores con type guards
// ✅ Ahora usamos objetos Asset del SDK de Stellar
const usdcAsset = new Asset(USDC_TESTNET.code, USDC_TESTNET.issuer);
const xlmAsset = Asset.native();Verifica en blockchain y base de datos antes de crear:
const { exists } = await checkExistingTrustline(publicKey);
if (exists) {
// Muestra warning en lugar de intentar crear
return;
}Feedback visual profesional en todos los componentes con loading states.
- Abre Freighter
- Ve a Settings → Network
- Selecciona Testnet
- Conecta tu wallet en la dApp
- Copia tu public key
- Ve a Friendbot
- Pega tu public key y solicita XLM
- Click en "✅ Crear Trustline"
- Confirma en Freighter (costo: 0.5 XLM)
- Espera confirmación
- Click en "🔄 Actualizar Balance"
- Deberías ver "0 USDC" (trustline creada, sin fondos aún)
- Ingresa cantidad de XLM
- Deja destino vacío (te envías a ti mismo)
- Click en "💸 Enviar Path Payment"
- Stellar convertirá XLM → USDC automáticamente
| Mejora | Descripción | Impacto |
|---|---|---|
| Constants.ts | Centraliza assets e issuers | 🔥🔥🔥 Alto |
| Spinner | Indicador de carga animado | 🔥🔥 Medio |
| Validación duplicados | Evita trustlines repetidas | 🔥🔥🔥 Alto |
| Instrucciones USDC | Guía para obtener testnet USDC | 🔥🔥 Medio |
| PathPayment | Conversión automática de assets | 🔥🔥🔥 Alto |
| TypeScript | Tipado completo del proyecto | 🔥🔥🔥 Alto |
- ✅ Verifica que tu cuenta tenga XLM (usa Friendbot)
- ✅ Confirma que Freighter esté en Testnet
- ✅ Necesitas más XLM (mínimo 1.5 XLM para trustline)
- ✅ Solicita más en Friendbot
- ✅ Aprueba la conexión en Freighter
- ✅ Desbloquea Freighter si está bloqueada
- ✅ No hay liquidez suficiente en testnet DEX
- ✅ Normal en testnet, funciona mejor en mainnet
- Cambia issuers a mainnet en
constants.ts - Cambia
HORIZON_URLS.testnet→HORIZON_URLS.mainnet - Cambia
Networks.TESTNET→Networks.PUBLIC - Actualiza Freighter a mainnet
- Prueba EXTENSIVAMENTE en testnet primero
- Ten XLM real (no es gratis como en testnet)
npm run build
vercel --prodConfigura las variables de entorno en Vercel Dashboard.
Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT.
Construido con 💙 por Karu Tiburona Builder
🦈⚡ ¡Sigue construyendo en Stellar! ⚡🦈