Un componente web desarrollado con Svelte que conecta con la blockchain de Stellar para gestionar operaciones de wallet de forma segura y eficiente.
- ¿Qué es una Blockchain?
- ¿Qué es Stellar?
- ¿Qué es una Wallet?
- ¿Qué es SvelteKit?
- Primeros Pasos
- Creación de Claves (Public Key y Private Key)
- Conectarse a Stellar
- Desarrollo Local
Una blockchain (cadena de bloques) es una tecnología de registro distribuido que almacena información de manera segura, transparente e inmutable.
- Descentralizada: No depende de una autoridad central
- Inmutable: Una vez registrados, los datos no pueden ser alterados
- Transparente: Todas las transacciones son visibles públicamente
- Segura: Utiliza criptografía avanzada para proteger la información
- Las transacciones se agrupan en bloques
- Cada bloque se enlaza criptográficamente al anterior
- Los nodos de la red validan y confirman las transacciones
- Una vez validado, el bloque se añade permanentemente a la cadena
Stellar es una red blockchain de código abierto diseñada para facilitar transacciones financieras rápidas, económicas y seguras a nivel global.
- Transacciones rápidas: Confirmaciones en 3-5 segundos
- Bajo costo: Tarifas mínimas (fracciones de centavo)
- Multi-moneda: Soporta cualquier tipo de activo digital
- Anclas: Permite conectar con sistemas financieros tradicionales
- DEX integrado: Exchange descentralizado incorporado
Los Lumens son la criptomoneda nativa de Stellar, utilizada para:
- Pagar tarifas de transacción
- Mantener cuentas activas (reserva mínima)
- Prevenir spam en la red
- Pagos transfronterizos
- Remesas internacionales
- Tokenización de activos
- Micropagos
- Sistemas de pago punto de venta
📖 Más información: Documentación oficial de Stellar
Una wallet (billetera) es una aplicación que permite almacenar, enviar y recibir criptomonedas de forma segura. No almacena realmente las monedas, sino las claves que te dan acceso a tus fondos en la blockchain.
-
Hot Wallets (Calientes)
- Conectadas a internet
- Más convenientes para uso diario
- Ejemplo: Wallets web, móviles, extensiones de navegador
-
Cold Wallets (Frías)
- Sin conexión a internet
- Máxima seguridad para almacenamiento a largo plazo
- Ejemplo: Hardware wallets, paper wallets
-
Public Key (Clave Pública): Dirección que compartes para recibir fondos
- Ejemplo en Stellar:
GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- Ejemplo en Stellar:
-
Private Key (Clave Privada): Clave secreta que nunca debes compartir
- Da acceso completo a tus fondos
- Ejemplo:
SXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
SvelteKit es un framework moderno para construir aplicaciones web de alto rendimiento basado en Svelte.
- Svelte: Framework reactivo que compila a JavaScript vanilla
- Performance: Sin Virtual DOM, código más rápido y ligero
- DX (Developer Experience): Sintaxis simple e intuitiva
- SSR/SSG: Renderizado del lado del servidor y generación estática
- File-based routing: Rutas basadas en estructura de carpetas
- TypeScript: Soporte nativo para TypeScript
- Componentes reactivos perfectos para interfaces de wallet
- Bundle pequeño para carga rápida
- Fácil integración con APIs blockchain
- Excelente para Progressive Web Apps (PWA)
📖 Más información: Documentación de SvelteKit
- Node.js (versión 18 o superior)
- pnpm instalado globalmente:
npm install -g pnpm - Editor de código (recomendado: VS Code)
- Conocimientos básicos de JavaScript/TypeScript
# 1. Clonar el repositorio
git clone git@github.com:paxapos/wallet-component.git
# 2. Entrar al directorio del proyecto
cd wallet-component
# 3. Instalar dependencias
pnpm install
# 4. Instalar dependencias adicionales de WalletConnect
pnpm add @reown/walletkit @walletconnect/utils @walletconnect/core
# 5. Iniciar servidor de desarrollo
pnpm run devUna vez iniciado el servidor, abre tu navegador en:
http://localhost:5173/
Deberías ver la interfaz de la wallet funcionando correctamente.
Este proyecto incluye funciones para generar pares de claves de Stellar:
import { Keypair } from '@stellar/stellar-sdk';
// Generar un nuevo par de claves
const keypair = Keypair.random();
// Obtener la clave pública (dirección de la cuenta)
const publicKey = keypair.publicKey();
console.log('Public Key:', publicKey);
// Ejemplo: GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Obtener la clave privada (¡MANTENER SECRETA!)
const privateKey = keypair.secret();
console.log('Private Key:', privateKey);
// Ejemplo: SXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX- Visita Stellar Laboratory
- Ve a la sección "Generate keypair"
- Haz clic en "Generate keypair"
- Guarda ambas claves en un lugar seguro
// Ejemplo práctico en el proyecto
import { StellarAccount } from './src/stellar_account';
// Crear nueva cuenta
const account = new StellarAccount();
await account.createAccount();
// Las claves se generan y almacenan automáticamente
console.log('Cuenta creada:', account.publicKey);DO (Hacer):
- ✅ Guarda tu clave privada en un gestor de contraseñas
- ✅ Haz backups cifrados de tus claves
- ✅ Usa variables de entorno para claves en desarrollo
- ✅ Implementa encriptación para almacenar claves
DON'T (No hacer):
- ❌ Nunca compartas tu clave privada
- ❌ No la guardes en texto plano
- ❌ No la subas a repositorios (usa .env y .gitignore)
- ❌ No la envíes por correo o mensajería
Crea un archivo .env en la raíz del proyecto:
# .env (NO SUBIR A GIT)
VITE_STELLAR_PUBLIC_KEY=GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
VITE_STELLAR_PRIVATE_KEY=SXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
VITE_STELLAR_NETWORK=testnet # o 'mainnet'Asegúrate de que .env esté en tu .gitignore:
# .gitignore
.env
.env.local
.env.*.localStellar ofrece dos redes principales:
-
Testnet (Red de Pruebas)
- Para desarrollo y testing
- Lumens gratis desde el Friendbot
- Sin valor real
- Horizon API:
https://horizon-testnet.stellar.org
-
Mainnet (Red Principal)
- Red de producción con valor real
- Requiere XLM reales
- Horizon API:
https://horizon.stellar.org
import { Networks, Horizon } from '@stellar/stellar-sdk';
// Para Testnet
const server = new Horizon.Server('https://horizon-testnet.stellar.org');
const networkPassphrase = Networks.TESTNET;
// Para Mainnet (producción)
// const server = new Horizon.Server('https://horizon.stellar.org');
// const networkPassphrase = Networks.PUBLIC;Para poder usar una cuenta en Testnet, necesita fondos iniciales:
import { Keypair } from '@stellar/stellar-sdk';
async function financiarCuentaTestnet(publicKey: string) {
try {
const response = await fetch(
`https://friendbot.stellar.org?addr=${publicKey}`
);
const result = await response.json();
console.log('Cuenta financiada:', result);
} catch (error) {
console.error('Error al financiar cuenta:', error);
}
}
// Usar
const keypair = Keypair.random();
await financiarCuentaTestnet(keypair.publicKey());async function consultarBalance(publicKey: string) {
try {
const account = await server.loadAccount(publicKey);
console.log('Balances de la cuenta:');
account.balances.forEach((balance) => {
if (balance.asset_type === 'native') {
console.log(`XLM: ${balance.balance}`);
} else {
console.log(
`${balance.asset_code}: ${balance.balance} (Emisor: ${balance.asset_issuer})`
);
}
});
} catch (error) {
console.error('Error al consultar balance:', error);
}
}import {
Keypair,
TransactionBuilder,
Operation,
Asset,
BASE_FEE
} from '@stellar/stellar-sdk';
async function enviarPago(
origenSecret: string,
destinoPublicKey: string,
cantidad: string
) {
try {
// Cargar cuenta origen
const origenKeypair = Keypair.fromSecret(origenSecret);
const origenAccount = await server.loadAccount(origenKeypair.publicKey());
// Construir transacción
const transaction = new TransactionBuilder(origenAccount, {
fee: BASE_FEE,
networkPassphrase: Networks.TESTNET
})
.addOperation(
Operation.payment({
destination: destinoPublicKey,
asset: Asset.native(), // XLM
amount: cantidad
})
)
.setTimeout(30)
.build();
// Firmar transacción
transaction.sign(origenKeypair);
// Enviar transacción
const result = await server.submitTransaction(transaction);
console.log('Transacción exitosa:', result);
return result;
} catch (error) {
console.error('Error en transacción:', error);
throw error;
}
}
// Ejemplo de uso
await enviarPago(
'SXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', // Tu clave privada
'GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', // Destino
'10.5' // Cantidad en XLM
);// Escuchar pagos recibidos
server
.payments()
.forAccount(publicKey)
.cursor('now')
.stream({
onmessage: (payment) => {
console.log('Pago recibido:', payment);
},
onerror: (error) => {
console.error('Error en stream:', error);
}
});wallet-component/
├── src/
│ ├── lib/ # Componentes Svelte reutilizables
│ │ ├── Wallet.svelte
│ │ ├── WalletQR.svelte
│ │ └── WalletSaldoHistory.svelte
│ ├── service/ # Servicios de blockchain
│ │ └── blockchains/
│ │ ├── stellar.ts # Lógica de Stellar
│ │ └── bitcoin.ts
│ ├── stellar_account.ts # Gestión de cuentas Stellar
│ ├── App.svelte # Componente principal
│ └── main.ts # Punto de entrada
├── public/ # Archivos estáticos
├── package.json
├── vite.config.ts # Configuración de Vite
├── svelte.config.js # Configuración de Svelte
└── tsconfig.json # Configuración de TypeScript
# Desarrollo con hot-reload
pnpm run dev
# Construir para producción
pnpm run build
# Preview de producción
pnpm run preview
# Linter
pnpm run lint
# Formatear código
pnpm run format- Usa siempre Testnet para desarrollo
- Obtén XLM gratis desde Friendbot
- Documenta tus transacciones de prueba
- No uses claves de producción en desarrollo
- 📖 Stellar Docs
- 🧪 Stellar Laboratory
- 🔍 Stellar Expert Explorer
- 💬 Stellar Stack Exchange
- 🐦 Stellar Discord
Una vez tengas el proyecto corriendo:
- Explora los componentes en
src/lib/ - Revisa la implementación de
stellar_account.ts - Crea una cuenta de prueba en Testnet
- Experimenta con transacciones de prueba
- Personaliza los componentes según tus necesidades
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 - ver el archivo LICENSE para más detalles.
Este software se proporciona "tal cual" sin garantías. Úsalo bajo tu propio riesgo. Siempre verifica las transacciones antes de enviarlas en Mainnet.