Teyolia es una implementación de crowdfunding no-custodial sobre eCash (XEC), con campañas tipo Flipstarter, flujo de firma con WalletConnect/Tonalli y payout condicionado al éxito.
frontend/: interfaz React + TypeScript (creación guiada, pledges, activación, payout).backend/: API para campañas, pledges, activación y payout.contracts/: lógica de covenant y pruebas.docs/: documentos técnicos y whitepaper.
- Non-custodial: el usuario firma en su wallet.
- Nunca compartas seed o llave privada.
- Comisión del 1% solo cuando la campaña se fondea exitosamente.
Desde esta versión, la fuente de verdad de campañas es SQLite (backend/data/campaigns.db) con compatibilidad gradual para backend/data/campaigns.json.
- Al arrancar backend:
- Se inicializa SQLite.
- Si SQLite está vacía y existe
campaigns.json, se migra de forma idempotente. - Luego se hidrata el store en memoria (sin cambiar contratos API).
- Variables de entorno backend relacionadas:
MIGRATE_ON_START=true(default): permite migrar JSON -> SQLite automáticamente al arranque.CAMPAIGNS_DUAL_WRITE_JSON=true(default): mantiene escritura dual SQLite + JSON para transición/ops.
- Migración manual:
cd backend
npm run migrate:campaignsConfiguración esperada de namespace/método/chain:
- namespace:
ecash - chain:
ecash:1 - method:
ecash_signAndBroadcastTransaction
El frontend valida estos valores antes de firmar; si la sesión no los incluye, pedirá reconectar wallet.
Debes crear un Project ID en Reown (WalletConnect Cloud) y pasarlo como variable de entorno.
- Obtención:
- Entra a Reown Cloud (WalletConnect Cloud).
- Crea un proyecto para tu dApp.
- Copia el Project ID.
- Variables frontend: Requeridas:
VITE_WC_PROJECT_ID=your_reown_project_idVITE_TONALLI_BASE_URL=https://cartera.xolosarmy.xyz(ohttp://127.0.0.1:5175en local)
Recomendadas:
VITE_WC_APP_NAME=Flipstarter 2.0VITE_WC_APP_URL=http://localhost:5174
Opcionales (solo si usas flujo external-sign):
VITE_TONALLI_BRIDGE_URLVITE_TONALLI_BRIDGE_ORIGINVITE_TONALLI_BRIDGE_PATHVITE_TONALLI_CALLBACK_URLVITE_TONALLI_TIMEOUT_MS
Tonalli es una app separada de Teyolia, por lo que VITE_TONALLI_BASE_URL no debe apuntar al mismo puerto del frontend.
- Seguridad:
- No comitear
.env.localni secretos. - Usa valores por entorno (dev/staging/prod).
- Backend:
cd backend
cp .env.example .env
npm install
npm run dev- Frontend:
cd frontend
cp .env.local.example .env.local
npm install
npm run dev- Fuente principal de persistencia:
backend/data/campaigns.db(SQLite). - Compatibilidad legacy: se mantiene
backend/data/campaigns.jsoncon dual-write. - En arranque, backend intenta cargar primero desde SQLite. Si está vacía, hace fallback a JSON y migra automáticamente.
- Para forzar migración manual:
cd backend
npm run migrate:campaignsEn frontend define:
Requeridas
VITE_WC_PROJECT_ID(Project ID de Reown/WalletConnect Cloud).VITE_TONALLI_BASE_URL(base URL de Tonalli; Tonalli es una app separada de Teyolia).
Recomendadas
VITE_WC_APP_NAMEVITE_WC_APP_URL
Opcionales (solo si usas external-sign/deep link)
VITE_TONALLI_BRIDGE_URLVITE_TONALLI_BRIDGE_ORIGINVITE_TONALLI_BRIDGE_PATHVITE_TONALLI_CALLBACK_URLVITE_TONALLI_TIMEOUT_MS
No comitees
.env.localni IDs reales de producción.
- Crea cuenta en Reown/WalletConnect Cloud.
- Crea un proyecto para la dApp.
- Copia el Project ID y configúralo como
VITE_WC_PROJECT_ID.
Si falta VITE_WC_PROJECT_ID, el frontend deshabilita “Conectar Tonalli” y muestra error claro.
- Levanta backend y frontend.
- Abre la dApp y pulsa Conectar Tonalli (WalletConnect).
- Escanea el QR/deeplink con Tonalli.
- Verifica que la sesión solicite:
- chain
ecash:1 - method
ecash_signAndBroadcastTransaction
- chain
- Ejecuta una acción de firma (activar campaña o payout).
- Confirma que llega
txidy cambia el estado de campaña.
cd frontend
npm run test:wc-sanityValida estáticamente que el namespace solicitado contiene ecash:1 y ecash_signAndBroadcastTransaction.
cd frontend
npm run buildValida estáticamente la configuración solicitada por la dApp:
cd frontend
npm run test:walletconnect:sanity- Levanta backend y frontend en local.
- Configura
VITE_WC_PROJECT_IDenfrontend/.env.local. - Abre la app y haz click en
Conectar Tonalli (WalletConnect). - Escanea QR o abre deeplink en Tonalli.
- Confirma que la sesión aprobada solicite
ecash_signAndBroadcastTransactionenecash:1. - Ejecuta una acción on-chain (por ejemplo activación de campaña).
- Verifica respuesta con
txidy cambio de estado de campaña. - Validación intent-only: al donar/activar con payload que solo trae
outputs, RMZWallet debe abrir modal y firmar sin mostrarUsa el formato txid:vout..
- Crear campaña (borrador).
- Pagar activación on-chain.
- Recibir pledges.
- Si se fondea, ejecutar payout (99% beneficiario, 1% infraestructura).
- Backend:
http://127.0.0.1:3001 - Frontend:
http://127.0.0.1:5173
MIT (LICENSE).