Pitch Day PULSO Argentina · Stellar Integration Track · 6 de julio 2026 Branch:
main— todo lo de abajo está mergeado y corriendo.
El repo es un monorepo frontend/ + api/. Se deployea como dos proyectos separados en Vercel:
- En el dashboard de Vercel → Add New Project → importar
Bitcoindefi/Passpay. - Vercel detecta el
vercel.jsonen la raíz que apunta afrontend/— no hay que cambiar nada. - Agregar variable de entorno:
(completar después de crear el proyecto API).
NEXT_PUBLIC_API_URL=https://<url-del-proyecto-api>.vercel.app - Deploy → listo.
- En Vercel → Add New Project → mismo repo
Bitcoindefi/Passpay. - Root Directory:
api(cambiar en la config del proyecto). - Framework Preset: Other.
- Build Command:
npm run vercel-build(correprisma generate && tsc). - Output Directory: dejar vacío (Vercel lo maneja con
vercel.jsonenapi/). - Agregar todas las variables de entorno del api/.env.example:
PASSPAY_SECRET=S... # clave secreta Stellar (cuenta fondeada) MERCHANT_PUBLIC=G... # clave pública del comercio PASSPAY_CVU=0000003100... # CVU recaudador PASSPAY_ALIAS=passpay.pago PASSPAY_MERCHANT_NAME=Passpay Demo PASSPAY_MERCHANT_CITY=Buenos Aires ANCHOR_PROVIDER=reference # cambiar a "anclap" cuando tengan credenciales T3_SETTLE_ASSET_CODE=XLM - Deploy → copiar la URL → pegarla en
NEXT_PUBLIC_API_URLdel proyecto frontend.
- El backend usa funciones serverless de Vercel (no un servidor persistente) — el plan Hobby alcanza para el hackathon.
- Prisma en serverless: el schema no tiene base de datos conectada aún, pero
prisma generategenera el cliente igual para los tipos — no rompe el deploy. - CORS: el backend ya tiene
cors()con*— funciona con cualquier dominio de Vercel.
| Módulo | Estado | Cómo probarlo |
|---|---|---|
| Rebrand completo Migo→Passpay | ✅ merged | cd frontend && npm run dev → http://localhost:3000 |
| Transferencias 3.0 / QR EMVCo | ✅ merged | POST /transferencias3/qr {"amountArs":15000} |
| Anchor SEP-24 (SDF testnet) | ✅ merged, validado e2e | GET /anchor/info + POST /anchor/ramp |
Frontend /cobrar-ars + /ramp |
✅ merged | http://localhost:3000/cobrar-ars |
| Pitch deck + guión de demo | ✅ merged | docs/PITCH.md, docs/DEMO.md |
Levantar local:
# Backend
cd api && cp .env.example .env # completar las vars que faltan
npm install && npx prisma generate && npm run dev # puerto 3001
# Frontend
cd frontend && npm install && npm run dev # puerto 3000Nota de entorno: esta máquina tiene un proxy TLS corporativo. Si
npx prisma generateo el fetch al anchor fallan conUNABLE_TO_VERIFY_LEAF_SIGNATURE, prefijar conNODE_TLS_REJECT_UNAUTHORIZED=0. Solo para local.
El off-ramp por BlindPay está completo y probado contra el sandbox real (in_fhAIC22j913R):
crear cuenta ARS → quote → authorize (XDR) → firmar wallet → payout.
Endpoints backend (/blindpay/*):
| Método | Ruta | Qué hace |
|---|---|---|
| GET | /blindpay/customers |
lista receivers (clientes KYC) |
| GET | /blindpay/customers/:id/bank-accounts |
lista cuentas ( |
| POST | /blindpay/customers/:id/bank-accounts |
crea cuenta ARS (transfers_type CBU/CVU/ALIAS) |
| POST | /blindpay/quote |
cotiza (bank_account_id + request_amount en centavos) |
| POST | /blindpay/authorize |
devuelve XDR sin firmar (campo transactionHash) |
| POST | /blindpay/payout |
ejecuta payout con la tx firmada |
| POST | /blindpay/receivers |
crea receiver (requiere tos_id) |
| POST | /blindpay/tos |
inicia ToS, devuelve URL hosted para aceptar |
Seed rápido para la demo:
cd api && NODE_TLS_REJECT_UNAUTHORIZED=0 node scripts/seed-blindpay-ar.mjs
# adjunta una cuenta ARS a un receiver aprobado y corre un quote real → imprime los IDsQuirks del sandbox de BlindPay (importante):
- La moneda fiat NO se elige con un campo — la define el rail del bank account:
transfers_bitso→ ARS. Por eso el quote solo necesitabank_account_id, no haytarget_currency. request_amountva en centavos (5000 = 50.00). Floats se rechazan.- Crear un receiver KYC nuevo NO es 100% automatizable: requiere aceptar los Términos en una página hosted (
POST /blindpay/tos→ abrir laurl→ aceptar → se genera eltos_id). Para la demo usamos los 10 receivers pre-aprobados del sandbox. GET .../bank-accountsdevuelve 502 para los receivers pre-cargados porque BlindPay sembró cuentas BR con CPF inválido y su propio listado se rompe al validarlas. No es nuestro bug. La página/offramplo maneja: si el listado falla, deja crear una cuenta ARS nueva y usa elidque devuelve el POST directamente.- Sandbox =
network=stellar_testnet,token=USDB(no USDC). En prod:stellar+USDC(cambiarBLINDPAY_NETWORK/BLINDPAY_TOKEN).
Pendiente para Romi/Bella: crear un receiver argentino real (no los US pre-cargados) corriendo el flujo de ToS una vez con un humano, y persistir los payouts en Prisma.
- Crear cuenta en Anclap y obtener credenciales sandbox ARS↔USDC.
- En
api/.envsetear:ANCHOR_PROVIDER=anclap # (o directamente) ANCHOR_HOME_DOMAIN=anclap.com ANCHOR_ASSET_CODE=ARS - El código ya descubre todo vía
stellar.toml(SEP-1) — no hay nada más que cambiar. - Validar que
GET /anchor/infodevuelva los endpoints de Anclap y que el flujo SEP-10 + SEP-24 complete con credenciales reales. - Archivo clave: api/src/services/anchor.service.ts
- Actualmente
POST /transferencias3/simulate-paymentsimula la acreditación. - Registrar el endpoint de acreditación real con Coelsa/PSP: cuando el banco liquida, Coelsa hace un POST a nuestra URL con los datos de la transferencia.
- Implementar el receptor en un nuevo controller
api/src/controllers/coelsa-webhook.controller.ts:- Validar firma HMAC del webhook.
- Parsear el monto y referencia.
- Llamar
sendSettlementPayment()destellar.service.tscon los datos reales.
- El flujo completo ya existe en
transferencias3.service.ts— solo hay que reemplazarsimulateInboundPayment()con la lógica real del webhook. - Archivo clave: api/src/services/transferencias3.service.ts
- Actualmente las transacciones de T3 y anchor no se persisten (respuesta en memoria).
- Agregar modelos en
prisma/schema.prisma:T3Transaction(id, amountArs, reference, status, coelsaId, stellarHash, createdAt)AnchorTransaction(id, direction, amount, anchorTransactionId, status, createdAt)
- Correr
npx prisma migrate devy conectar los controllers. - Archivo clave: api/prisma/schema.prisma
- Configurar en el hosting (Railway / Render / Fly) las vars de
api/.env.example. - Asegurarse que
PASSPAY_SECRETsea una cuenta Stellar fondeada en mainnet con trustline a USDC (Circle). - La cuenta para testnet se fondea gratis con Friendbot.
- Actualmente
sendSettlementPayment()enstellar.service.tsenvía XLM o el asset configurado directamente. - Implementar
pathPaymentStrictReceivepara que el comercio reciba siempre en su moneda preferida (ej. USDC), aunque el settlement interno use XLM. - Stellar SDK:
PathPaymentStrictReceiveOperation— la ruta la descubre Horizon automáticamente. - Archivo clave: api/src/services/stellar.service.ts — función
sendSettlementPayment().
GET /payments?merchantId=xxx&from=2026-01-01&to=2026-07-01- Agregar filtros por tipo (T3 / anchor / SEP-7) y estado.
- Depende del punto 3 de Romi (persistencia).
- En
ramp/page.tsxel polling tiene un loop básico cada 4s. - En el backend, si el anchor devuelve
status: error, agregar lógica de reintento con backoff y notificación. - Archivo: api/src/controllers/anchor.controller.ts
- Escribir tests con Supertest (ya está en
api) para:POST /transferencias3/qr— verificar que el CRC del EMV es válido.GET /anchor/info— mockear fetch del stellar.toml y verificar parseo.POST /anchor/ramp— mock del challenge SEP-10 y del interactive SEP-24.
- Hay tests existentes en
api/src/__tests__/para tomar de referencia.
- El guión completo está en docs/DEMO.md — 4 escenas listas.
- Setup necesario antes de grabar:
- Pedir a Romi que levante el backend y frontend en local (o en staging).
- Tener una cuenta testnet fondeada con Friendbot.
- Setear
ANCHOR_PROVIDER=reference(usa el anchor de referencia SDF, no necesita credenciales de Anclap).
- Herramientas sugeridas: Loom / OBS para captura de pantalla, Canva/CapCut para editar.
- El video tiene que mostrar:
- Home de Passpay.
- Flujo cobrar ARS → QR → simular pago → receipt con hash on-chain.
- Ramp SEP-24 (abrir el anchor hosted, mostrar el polling de estado).
- Formato: horizontal 16:9, subtitulado en español, música suave de fondo.
- El outline completo está en docs/PITCH.md — 11 slides con textos.
- Diseñar en Canva, Figma o PowerPoint con la paleta de marca:
- Fondo:
#0B0E14(Deep) - Primario:
#5B4BF5(Indigo) - Acento:
#16E0A3(Mint) - Texto: blanco /
#8B7CF8(Violeta) - Alerta/CTA:
#FFB020(Amber)
- Fondo:
- Logo SVG disponible en
frontend/public/passpay-logo.svg. - Slide 4 (demo) puede ser una captura del video o un GIF.
- Armar una slide o documento corto (1 página) que responda:
- ¿Cuántas transacciones mueve Transferencias 3.0 por mes? (dato BCRA público)
- ¿Cuántos comercios usan QR interoperable en Argentina? (dato BCRA / Mercado Pago)
- ¿Qué volumen opera Anclap o similares en ARS↔USDC?
- Comparativa de alternativas: Ripio Business, Lemon Cash Business, etc. — qué tienen y qué no.
- Fuentes: BCRA (bcra.gob.ar), comunicados del BCRA sobre Transferencias 3.0, blogs de Stellar.
- Crear o actualizar el perfil de Passpay en Twitter/X y LinkedIn antes del pitch.
- Tweet de lanzamiento del repo (una vez que esté listo): logo + tagline + link al repo.
- Post de LinkedIn contando el proyecto: problema → solución → Stellar.
- Tagline confirmada: "Cobrá en cualquier moneda. Liquidá en dólares on-chain."
- Una página A4 que resuma:
- Problema, solución, cómo funciona (diagrama de flujo simple).
- Stack técnico (sin entrar en detalle, solo Stellar + Transferencias 3.0 + Anclap).
- Estado actual (MVP validado en testnet).
- Equipo + contacto.
- Puede reutilizar contenido del pitch deck.
Cliente (banco / billetera)
│ Transferencias 3.0 (QR EMVCo / CVU)
▼
Passpay Backend (Express/TS)
├── /transferencias3 ← acreditación ARS
├── /anchor ← SEP-1/10/24 (Anclap / SDF)
└── /payments ← splits, POS, pay-link
│ Stellar SDK
▼
Stellar Network (Horizon)
├── Path Payment → settlement en USDC/XLM
└── Anchor ↔ off-ramp a ARS (Anclap SEP-24)
Repo: https://github.com/Bitcoindefi/Passpay
Dudas de código → Leo (llc). Issues del repo: abrir un GitHub issue con label hackathon.