Stellar Proof of Togetherness -> Visit US https://spot-develop.up.railway.app/
La plataforma descentralizada de NFTs de asistencia construida sobre Stellar Blockchain
🚀 Características • 🏗️ Arquitectura • 💰 Modelo de Negocio • ⚙️ Cómo Funciona • 🛠️ Tech Stack • 📦 Instalación
SPOT (Stellar Proof of Togetherness) es la plataforma descentralizada que revoluciona cómo creamos y compartimos recuerdos de eventos. Similar a POAP, pero construido nativamente sobre Stellar Blockchain para ofrecer transacciones ultrarrápidas, costos mínimos y una experiencia verdaderamente sostenible.
|
|
| Problema | Solución SPOT |
|---|---|
| 🎫 Crear NFTs de asistencia es complicado | Interfaz intuitiva, creación en minutos |
| 💸 Costos altos en otras blockchains | Transacciones casi gratuitas en Stellar |
| ⏱️ Tiempos de confirmación largos | Confirmación en 3-5 segundos |
| 🌱 Impacto ambiental negativo | Blockchain sostenible y eficiente |
| 🔗 Limitado a un método de distribución | Múltiples métodos: QR, Links, Geolocalización, Códigos |
| 🎨 No personalizable | Múltiples colecciones por evento, roles y permisos |
|
|
|
|
|
|
|
Sistema Híbrido: Combinamos lo mejor de ambos mundos para ofrecer la máxima seguridad sin comprometer la experiencia de usuario.
graph TB
subgraph "Frontend Layer"
UI[React App]
Wallet[Freighter Wallet]
UI --> Wallet
end
subgraph "Backend Layer"
Backend[Express Backend]
Storage[Storage Service]
DB[Database]
Backend --> Storage
Backend --> DB
end
subgraph "Blockchain Layer - Stellar"
Factory[Factory Contract]
Event1[Event Contract 1]
Event2[Event Contract 2]
EventN[Event Contract N]
Factory --> Event1
Factory --> Event2
Factory --> EventN
end
subgraph "Payment System"
Payment[Stellar Payment]
Credits[Credit Management]
Backend --> Payment
Backend --> Credits
end
UI --> Backend
UI --> Factory
Backend --> Factory
Factory --> Payment
style UI fill:#61dafb
style Factory fill:#7b61ff
style Backend fill:#ff6b6b
style Payment fill:#ffd93d
SPOT utiliza un patrón Factory para crear instancias de eventos:
graph LR
subgraph "Factory Contract"
FC[Factory]
FC --> |create_event| EC[Event Template]
end
subgraph "Event Contract"
EC --> NFT[NFT Standard]
EC --> AC[Access Control]
EC --> ST[Storage]
EC --> MT[Mint Logic]
EC --> BN[Burn Logic]
end
subgraph "NFT Features"
NFT --> OWN[Ownership]
NFT --> APP[Approvals]
NFT --> URI[token_uri]
NFT --> ENUM[Enumerable]
end
style FC fill:#7b61ff
style EC fill:#ff6b6b
style NFT fill:#4ecdc4
Híbrido On-Chain / Off-Chain:
graph TB
subgraph "On-Chain Storage"
CONTRACT[Event Contract]
URI[token_uri]
METADATA[Metadata Struct]
CONTRACT --> URI
CONTRACT --> METADATA
end
subgraph "Off-Chain Storage"
JSON[JSON File]
IMAGE[Image File]
STORAGE[Storage Service]
JSON --> STORAGE
IMAGE --> STORAGE
end
subgraph "Metadata Content"
M1[event_name]
M2[event_date]
M3[location]
M4[description]
M5[image_url]
METADATA --> M1
METADATA --> M2
METADATA --> M3
METADATA --> M4
METADATA --> M5
end
URI --> JSON
JSON --> IMAGE
Qué se guarda donde:
- On-Chain: Metadata esencial del evento (nombre, fecha, lugar, descripción, URIs) - Verificable e inmutable
- Off-Chain: Imágenes de alta resolución - Optimizado para costos
El organizador crea un evento y el sistema despliega automáticamente un contrato inteligente único
sequenceDiagram
participant O as Organizador
participant UI as Frontend
participant B as Backend
participant F as Factory Contract
participant E as Event Contract
participant S as Storage
O->>UI: Crear evento
UI->>B: Validar y procesar
B->>B: Verificar plan (gratis o pago)
alt Evento >100 SPOTs o Empresarial
B->>O: Solicitar pago (Stellar)
O->>B: Pagar XLM
end
B->>S: Subir imagen del SPOT
S-->>B: URL de imagen
B->>F: Crear nuevo evento
F->>E: Instanciar Event Contract
E-->>F: Contract Address
F-->>B: Event ID + Contract Address
B->>DB: Guardar metadatos
B-->>UI: Evento creado exitosamente
UI-->>O: Confirmación
- 📝 Formulario de Evento: El organizador completa la información del evento (nombre, fecha, ubicación, descripción)
- 💰 Verificación de Plan: El sistema determina automáticamente si el evento es gratuito (≤100 SPOTs) o requiere pago
- 💳 Procesamiento de Pago (si aplica): Pago seguro con XLM a través de Stellar Network
- 🖼️ Subida de Imagen: La imagen del SPOT se almacena en el servicio de storage
- 🏭 Despliegue de Contrato: El Factory Contract crea automáticamente un nuevo Event Contract único
- 💾 Almacenamiento de Metadata: La información se guarda tanto on-chain como off-chain
- ✅ Evento Listo: El evento está activo y listo para distribuir SPOTs
El asistente reclama su SPOT usando el método que prefiera
sequenceDiagram
participant U as Usuario
participant UI as Frontend
participant B as Backend
participant E as Event Contract
participant W as Wallet (Freighter)
U->>UI: Escanear QR / Usar link / Código
UI->>B: Validar método de claim
B->>B: Verificar geolocalización (si aplica)
B->>B: Verificar códigos/QRs usados
B->>B: Validar fechas de claim
B-->>UI: Validación OK
UI->>W: Solicitar firma de transacción
W->>U: Confirmar transacción
U->>W: Firmar transacción
W->>E: Ejecutar mint()
E->>E: Validar límites y permisos
E->>E: Verificar no duplicado
E->>E: Guardar metadata on-chain
E-->>W: NFT minteado (token_id)
W-->>UI: Transacción exitosa
UI->>B: Notificar claim exitoso
B->>B: Actualizar contadores
UI-->>U: SPOT recibido
|
|
SPOT soporta múltiples métodos de distribución, cada uno con sus propias validaciones:
graph LR
subgraph "Métodos de Claim"
QR[QR Code]
LINK[Unique Link]
GEO[Geolocalización]
CODE[Shared Code]
end
subgraph "Validación"
V1[Verificar unicidad]
V2[Verificar expiración]
V3[Verificar geolocalización]
V4[Verificar límites]
end
QR --> V1
LINK --> V2
GEO --> V3
CODE --> V4
V1 --> MINT[Mint NFT]
V2 --> MINT
V3 --> MINT
V4 --> MINT
Características de cada método:
| Método | Descripción | Validación |
|---|---|---|
| QR Code | Código único escaneable | Un QR puede usarse múltiples veces hasta agotar NFTs disponibles. Una wallet solo puede reclamar 1 vez |
| Unique Link | Link único por evento | Expira según configuración del organizador (máximo 1 semana) |
| Geolocalización | Validación por proximidad | Radio configurable por el organizador. Validación off-chain |
| Código Compartido | Código compartible | Limitado a la cantidad de NFTs creados. Se puede usar hasta agotar |
Control granular de acceso basado en roles:
graph TB
subgraph "Roles"
OWNER[Owner]
ADMIN[Admin]
MINTER[Minter]
VIEWER[Viewer]
end
subgraph "Permisos Owner"
O1[Crear evento]
O2[Eliminar evento]
O3[Modificar evento]
O4[Agregar/remover roles]
O5[Mintear SPOTs]
O6[Quemar SPOTs]
OWNER --> O1
OWNER --> O2
OWNER --> O3
OWNER --> O4
OWNER --> O5
OWNER --> O6
end
subgraph "Permisos Admin"
A1[Modificar evento]
A2[Agregar/remover roles]
A3[Mintear SPOTs]
A4[Quemar SPOTs]
ADMIN --> A1
ADMIN --> A2
ADMIN --> A3
ADMIN --> A4
end
subgraph "Permisos Minter"
M1[Mintear SPOTs]
MINTER --> M1
end
subgraph "Permisos Viewer"
V1[Ver eventos]
V2[Ver SPOTs]
VIEWER --> V1
VIEWER --> V2
end
Eventos pequeños gratuitos • Eventos grandes con planes flexibles
Completamente Gratuito • Sin Tarjeta de Crédito • Sin Límites de Eventos
|
|
Precios Flexibles • Funcionalidades Completas • Soporte Prioritario
|
|
Tu contribución ayuda a mantener SPOT gratuito para eventos pequeños
|
|
graph TB
subgraph "Ingresos"
I1[Eventos >100 SPOTs]
I2[Eventos Empresariales]
I3[Donaciones]
end
subgraph "Uso de Ingresos"
U1[Mantenimiento de Infraestructura]
U2[Soporte a Eventos Gratuitos]
U3[Desarrollo y Mejoras]
U4[SPOTs Exclusivos para Donantes]
end
I1 --> U1
I2 --> U1
I3 --> U2
I1 --> U3
I2 --> U3
I3 --> U4
style I1 fill:#ff6b6b
style I2 fill:#ff6b6b
style I3 fill:#4ecdc4
style U2 fill:#95e1d3
style U4 fill:#95e1d3
Modelo Sostenible:
- Los eventos grandes y empresariales financian la plataforma
- Las donaciones apoyan eventos gratuitos y desarrollo
- Todos los usuarios se benefician de una plataforma robusta y gratuita para uso personal
- Red: Stellar Network (Futurenet para pruebas, Mainnet para producción)
- Smart Contracts: Soroban (Runtime de Stellar)
- Lenguaje: Rust
- SDK: Soroban SDK v23.0.3+
- Estándar NFT: SEP-41 (Stellar Enhancement Proposal 41)
- Librerías:
stellar-tokens: NFTs estándar de Stellarstellar-access: Control de acceso y rolesstellar-macros: Macros para simplificar código
- Framework: React 18+ con TypeScript
- Build Tool: Vite
- Wallet: Freighter Wallet SDK
- Cliente Stellar:
@stellar/stellar-sdkysoroban-client - Estado: React Context API
- Data Fetching: TanStack Query
- UI Components: Stellar Design System
- Estilos: Tailwind CSS
- Platform: Express.js (Node.js/TypeScript)
- Storage: Servicio de almacenamiento para imágenes
- Database: Base de datos para metadatos de eventos
- Payment Processing: Stellar Payments (XLM)
- CI/CD: GitHub Actions
- Testing: Vitest (frontend), Rust tests (contratos)
- Deployment: Servicios de hosting estándar
- Monitoring: Analytics y logging
|
|
|
|
git clone <repo-url>
cd commitsPrecd blockotitos
cp .env.example .env
# Edita .env con tus configuracionesnpm install
cd backend && npm install && cd ..cargo build --target wasm32v1-none --releasenpm run dev¡Listo! 🎉 La aplicación estará corriendo en http://localhost:5173
Edita environments.toml para configurar tus entornos:
- Local: Desarrollo en tu máquina
- Testnet: Pruebas en Stellar Testnet
- Mainnet: Producción en Stellar Mainnet
SPOT es desarrollado por un equipo apasionado de desarrolladores:
Desarrollo y Smart Contracts / Backend
Desarrollo y Diseño
Desarrollo y Smart Contracts
Diseño y Edición
Desarrollo y Smart Contracts / Backend
¿Por qué?
- On-Chain: Metadata esencial (verificable e inmutable)
- Off-Chain: Imágenes y datos grandes (optimización de costos)
Beneficios:
- ✅ Costos reducidos de almacenamiento en blockchain
- ✅ Verificabilidad completa de metadata esencial
- ✅ Escalabilidad mejorada
Validaciones On-Chain:
- Límites de NFTs
- Prevención de duplicados
- Fechas de claim
- Permisos de roles
Validaciones Off-Chain:
- Planes y créditos del usuario
- Geolocalización
- Tracking de códigos/QRs usados
- Rate limiting
Beneficios:
- ✅ Seguridad máxima
- ✅ Flexibilidad para lógica compleja
- ✅ Optimización de costos
¿Por qué usar Factory?
- ✅ Escalabilidad: Cada evento es un contrato independiente
- ✅ Aislamiento: Problemas en un evento no afectan otros
- ✅ Actualización: Posibilidad de mejorar contratos nuevos sin afectar existentes
¿Por qué eventos pequeños gratuitos?
- ✅ Accesibilidad: Cualquiera puede crear eventos personales
- ✅ Adopción: Facilita la adopción masiva de la plataforma
- ✅ Sostenibilidad: Eventos grandes financian la infraestructura
¿Por qué varios métodos?
- ✅ Adaptabilidad: Diferentes eventos requieren diferentes métodos
- ✅ Usabilidad: Los usuarios pueden elegir el método más conveniente
- ✅ Flexibilidad: Los organizadores pueden configurar según necesidades
erDiagram
USER ||--o{ EVENT : creates
USER ||--o{ DONATION : makes
EVENT ||--o{ COLLECTION : has
COLLECTION ||--o{ SPOT : contains
EVENT ||--o{ DELEGATE : has
EVENT ||--o{ QR_CODE : generates
EVENT ||--o{ CLAIM_CODE : generates
USER {
string address
string email
timestamp created_at
string plan_type
}
DONATION {
string id
string donor_address
int amount_xlm
string exclusive_spot_id
timestamp created_at
}
EVENT {
string id
string contract_address
string creator_address
string name
date event_date
string location
string description
timestamp claim_start
timestamp claim_end
int max_nfts
int minted_nfts
string image_url
bool is_paid
}
COLLECTION {
string id
string event_id
string name
int max_nfts
int minted_nfts
}
SPOT {
string token_id
string collection_id
string owner_address
string metadata_uri
timestamp minted_at
bool is_exclusive
}
DELEGATE {
string event_id
string address
string role
timestamp added_at
}
QR_CODE {
string id
string event_id
string code
bool used
int uses_remaining
timestamp expires_at
}
CLAIM_CODE {
string id
string event_id
string code
int uses_remaining
timestamp expires_at
}
graph TB
subgraph "Validaciones On-Chain"
V1[Límite de NFTs]
V2[No duplicados]
V3[Permisos de roles]
V4[Fechas de claim]
V5[Ownership]
end
subgraph "Validaciones Off-Chain"
V6[Plan del usuario]
V7[Validación de pago]
V8[Geolocalización]
V9[Códigos/QRs usados]
V10[Rate limiting]
end
subgraph "Backend Security"
S1[Authentication]
S2[JWT Tokens]
S3[API Rate Limits]
S4[IP Whitelisting]
end
V1 --> CONTRACT[Smart Contract]
V2 --> CONTRACT
V3 --> CONTRACT
V4 --> CONTRACT
V5 --> CONTRACT
V6 --> BACKEND[Backend]
V7 --> BACKEND
V8 --> BACKEND
V9 --> BACKEND
V10 --> BACKEND
S1 --> BACKEND
S2 --> BACKEND
S3 --> BACKEND
S4 --> BACKEND
- ✅ Validación dual: On-chain + Off-chain
- ✅ Prevención de duplicados: Un wallet = 1 SPOT por colección
- ✅ Rate limiting: Prevención de spam y ataques
- ✅ Control de acceso: Sistema de roles granular
- ✅ Validación de fechas: Períodos de claim configurables
- ✅ Quemado automático: SPOTs no reclamados se queman automáticamente
¡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
- Lee nuestro Código de Conducta
- Revisa nuestro CONTRIBUTING.md
- Asegúrate de que los tests pasen
- Actualiza la documentación según sea necesario
Únete a la revolución de los NFTs de asistencia en Stellar
📦 Instalación • 📖 Documentación • 💬 Comunidad • 🤝 Contribuir
⭐ Dános una estrella • 🐛 Reportar Bug • 💡 Sugerir Feature
Última actualización: Noviembre 2025
