Nota sobre traducciones: Estas traducciones pueden estar desactualizadas con respecto a la versión en inglés. Consulta el archivo
README.mden inglés para obtener la información más reciente.
StellarStream es un MVP (producto mínimo viable) de streaming de pagos básico para el ecosistema Stellar. Incluye:
- Un panel de control en React para crear y monitorear streams
- Una API en Node.js/Express para operaciones del ciclo de vida de streams
- Un scaffold de contrato inteligente Soroban para la lógica de streams en cadena
- Una carpeta de backlog con borradores de tareas de implementación
Este repositorio es intencionalmente liviano y fácil de extender.
Para preguntas comunes y solución de problemas, consulta FAQ.md.
Para configuración de producción y operaciones, consulta DEPLOYMENT.md y RUNBOOK.md.
Para la política de seguridad y reporte de vulnerabilidades, consulta SECURITY.md.
Estamos comprometidos con un ambiente acogedor; consulta CODE_OF_CONDUCT.md.
StellarStream modela un stream de pagos donde un remitente asigna un monto total durante una duración fija. A medida que pasa el tiempo, el destinatario "adquiere" (vest) valor de forma continua.
Comportamiento actual del MVP:
- Crear stream
- Listar streams con progreso en vivo
- Cancelar stream
- Mostrar métricas calculadas (activos/completados/adquiridos)
- Rastrear y mostrar historial de eventos para acciones del ciclo de vida del stream
- Aplicación React + Vite
- Usa el proxy
/apipara llamar al backend - Consulta la lista de streams cada 5 segundos
- API REST Express
- Base de datos SQLite para almacenamiento persistente
- Worker indexador de eventos para rastrear el ciclo de vida del stream
- Calcula el progreso en tiempo real a partir de marcas de tiempo
- Firma criptográficamente webhooks salientes usando HMAC-SHA256 para notificaciones seguras del ciclo de vida
- Scaffold de contrato Soroban en Rust
- Soporta
create_stream,claimable,claimycancel - Aún no integrado con el backend en este MVP
Para cada stream definido por un monto total (
En cualquier momento actual
Reglas de Estado
-
scheduled: cuando$t < t_{start}$ -
active: cuando$t_{start} \le t < t_{end}$ -
completed: cuando$t \ge t_{end}$ -
canceled: cuando el stream fue terminado anticipadamente de forma explícita
La documentación interactiva de la API está disponible a través de Swagger UI en:
- Swagger UI:
/api/docs - Especificación OpenAPI sin procesar:
/api/docs/openapi.json
URL Base:
- Local:
http://localhost:3001 - Proxy del frontend:
/api
Propósito: Verificación de estado del servicio
Respuesta: service, status, timestamp
Propósito: Listar streams ordenados del más reciente al más antiguo, con filtrado y paginación opcionales
Parámetros de consulta (opcionales):
status:scheduled|active|completed|canceledsender: string (coincidencia exacta de remitente)recipient: string (coincidencia exacta de destinatario)asset: string (coincidencia exacta de código de activo)q: string (término de búsqueda general — busca en ID del stream, remitente, destinatario y código de activo, sin distinción de mayúsculas)page: number (entero >= 1)limit: number (entero 1..100)
Respuesta:
{
"data": "Stream[]",
"total": "number",
"page": "number",
"limit": "number"
}Propósito: Obtener un stream individual por ID
Respuesta: { "data": Stream } | Error: 404 si el stream no existe
Propósito: Obtener todos los streams para un destinatario específico
Respuesta: { "data": Stream[] } (incluye progreso calculado para cada stream)
Propósito: Obtener la lista blanca de activos permitidos
Respuesta: { "data": string[] } (códigos de activos normalizados)
Propósito: Crear un nuevo stream
Cuerpo de la solicitud:
{
"sender": "string",
"recipient": "string",
"assetCode": "string",
"totalAmount": "number",
"durationSeconds": "number",
"startAt": "number (opcional, segundos Unix)"
}Respuesta: 201 Created con { "data": Stream }
Propósito: Cancelar un stream existente
Respuesta: { "data": Stream } con estado canceled | Error: 404 si el stream no existe
Propósito: Devuelve los elementos del backlog de implementación mostrados en la UI
Respuesta: { "data": OpenIssue[] }
Propósito: Obtener la línea de tiempo del historial de eventos de un stream específico
Respuesta: { "data": StreamEvent[] } (ordenados por marca de tiempo ascendente)
Tipos de eventos: created, claimed, canceled, start_time_updated
- Node.js 18+
- npm 9+
- Opcional para trabajo con contratos: Rust + toolchain Soroban
Desde la raíz del repositorio:
npm run install:all
npm run dev:backend
npm run dev:frontendAlternativa manual:
cd backend && npm install && npm run dev
cd frontend && npm install && npm run dev- Frontend: http://localhost:3000
- Backend: http://localhost:3001
Para desarrollo local con Docker, usa el archivo docker-compose.override.yml que monta automáticamente los directorios fuente y habilita la recarga en caliente:
docker-compose up- Recarga en caliente del backend: Los cambios en
backend/src/activan el reinicio automático viats-node-dev. - Recarga en caliente del frontend: Los cambios en
frontend/src/activan Vite HMR. - Volumen de base de datos: Persiste entre reinicios.
npm run buildMIT