Sistema de remesas recurrentes con programa Anchor en Solana, backend Express, bot WhatsApp (Baileys), Blinks y keeper cron.
Demo en vivo: ver DEMO.md (guión ~3 min + checklist WayLearn).
Composabilidad on-chain: eventos PagoEjecutado, PDAs PagoReceipt y perfiles por wallet. Ver docs/COMPOSABILITY.md.
Usuarios reales (corredor MX ↔ EE.UU.): persona no bancarizada, receptora rural, confianza vía tiendita/comerciantes/PYMEs/familia. Ver docs/PERSONA-MX-US.md y registro docs/VALIDACION-USUARIOS.md · API POST /api/pilotos · landing /piloto.
Crecimiento (SGE / IA): playbook orgánico con hooks + funnel → docs/GROWTH-SGE.md.
remesa-blink/
├── anchor/remesas_recurrentes/ # Programa Anchor
├── backend/ # API Express + Keeper
├── bot/ # Bot WhatsApp (Baileys)
├── blinks/ # Servidor Blinks (legacy / standalone)
├── frontend/ # Next.js — interfaz web (suscripciones, cashback, enlaces Blinks)
├── db/ # Schema PostgreSQL
└── README.md
- Node.js 18+
- PostgreSQL
- Solana CLI (Anchor)
- Rust
cd anchor/remesas_recurrentes
yarn install
anchor build
anchor deploy --provider.cluster devnetAnota el PROGRAM_ID (en Anchor.toml) para el backend.
Opción A - Docker (recomendado para desarrollo local):
docker compose up -d
sleep 5 && npm run db:schemaAsegura DATABASE_URL=postgresql://user:pass@localhost:5432/remesa_blink en backend/.env (ver docker-compose.yml).
Opción B - PostgreSQL local:
sudo apt install postgresql postgresql-client
sudo service postgresql start
sudo -u postgres createdb remesa_blink
# Ajusta user/pass en backend/.env para tu usuario PostgreSQL
npm run db:schemaOpción C - Neon/Supabase (gratis, sin instalar):
- Crea cuenta en neon.tech o supabase.com
- Crea un proyecto y copia la connection string
- Ponla en
backend/.envcomoDATABASE_URL npm run db:schema(desde la raíz del proyecto)
Copia los .env.example en cada módulo y configura:
backend/.env
DATABASE_URL: PostgreSQLSOLANA_RPC_URL: https://api.devnet.solana.comPROGRAM_ID: ID del programa AnchorKEEPER_PRIVATE_KEY: Clave base58 del keeper (wallet que ejecuta pagos)
bot/.env
API_BASE_URL: http://localhost:3000
blinks/.env
PORT: 3001BLINKS_BASE_URL: URL pública del servidor Blinks
frontend/.env (copia desde frontend/.env.example)
- Abres la app en
http://localhost:3003(npm run dev:web). NEXT_PUBLIC_API_URL: URL del backend (normalmentehttp://localhost:3000), no la del frontend. Si la pones en 3003, las peticiones fallan porque Next no es el API.NEXT_PUBLIC_BLINKS_BASE_URL: opcional; si los Blinks están en otro origen que el API
solana airdrop 2 <KEEPER_ADDRESS> --url devnetEn terminales separadas (o desde raíz con npm run):
# Backend API + Blinks (unificado)
npm run dev
# o: cd backend && npm run dev
# Keeper (cron cada hora)
npm run keeper
# Bot WhatsApp
cd bot && npm install && npm run start
# Frontend web (Next.js en :3003 — evita choque con backend :3000)
cd frontend && npm install && npm run dev
# o desde raíz: npm run dev:webScripts desde raíz:
npm run dev— Backend + Blinksnpm run dev:web— Interfaz web Next.js (frontend/)npm run build:web/npm run start:web— Build y producción del frontendnpm run keeper— Keeper cronnpm run keeper:airdrop— Dirección para airdropnpm run keeper:usdc-ata— Crear ATA USDC del keepernpm run e2e:sol— E2E: suscripción SOL + keeper + cashbacknpm run e2e:usdc— E2E: suscripción USDC + keepernpm run preflight— smoke keeper + balance USDCnpm run anchor:test— tests Anchor (local validator)
- Registrar suscripción SOL:
/recurrente 0.01 diario 521234567890 F3bBUduLLoLFxCpEmPuQXvHwM2yshiHFuTvAcGJ4ANm3 - Registrar suscripción USDC:
/recurrente 10 USDC diario 521234567890 F3bBUduLLoLFxCpEmPuQXvHwM2yshiHFuTvAcGJ4ANm3 - Ver suscripciones:
/mis-remesas - Cashback:
/cashback,/generar-codigo - Blinks:
enviar-remesa(SOL),enviar-remesa-usdc(USDC),convertir-mxn(USDC→MXN),onboarding-mxn(KYC+CLABE)
- Destinatario completa onboarding:
POST /api/etherfuse/onboarding-urlcon{ destinatario_solana, destinatario_wa? }→ obtiene URL Etherfuse (KYC + CLABE) - Etherfuse envía webhook
kyc_updated→ actualizamosbeneficiarios_etherfuse.kyc_status = 'verified' - Keeper ejecuta pago USDC → incluye Blink
convertir-mxn(si KYC ok) oonboarding-mxn(si pendiente) - Destinatario usa Blink
convertir-mxn→ firma burn USDC → recibe MXN en SPEI
Lenguaje natural (recomendado para piloto / Demo Day):
| Escribes | Qué hace |
|---|---|
| hola / ayuda | Menú |
| enviar | Guía paso a paso (monto → frecuencia → nombre → WA familia → wallet) |
| mis envíos | Lista remesas activas |
| recompensas | Cashback / referidos |
| soporte | Contacto humano |
| cancelar | Sale del flujo enviar |
Alias técnicos (siguen funcionando): /recurrente, /mis-remesas, /cashback, /ayuda, /generar-codigo, /canjear, /soporte.
| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/suscripciones | Registrar suscripción |
| GET | /api/suscripciones/:wa | Listar suscripciones |
| POST | /api/cashback/generar-codigo | Generar código referido |
| POST | /api/cashback/registrar-referido | Registrar referido |
| GET | /api/cashback/:wa | Resumen cashback |
| POST | /api/cashback/canjear | Canjear cashback |
| POST | /api/etherfuse/onboarding-url | URL KYC+CLABE (destinatario_solana, destinatario_wa?) |
| Día | Tareas |
|---|---|
| 1 | Programa Anchor, deploy devnet |
| 2 | Schema PostgreSQL, backend DB |
| 3 | Endpoints suscripciones y cashback |
| 4 | Keeper cron |
| 5 | Bot Baileys |
| 6 | Blinks, pruebas E2E |
| 7 | README, ajustes |