# Cuentas de usuario y perfiles

OfferHub separa **identidad de usuario**, **cuentas financieras**, y **aplicación de escrow** en sistemas distintos.

Esta separación es intencional y requerida para:

* minimizar el riesgo de custodia,
* evitar almacenar datos financieros sensibles,
* mantener compatibilidad con el alcance de la API de Airtm,
* mantener Trustless Work enfocado en la aplicación.

***

### Responsabilidades del Sistema

#### OfferHub + Supabase (Identidad y Perfil)

Manejado por **Supabase**.

Responsabilidades:

* registro e inicio de sesión de usuarios
* autenticación y sesiones
* datos de perfil del marketplace
* roles de usuario (comprador / vendedor)
* vinculación de cuentas externas (referencia Airtm)

Se recomienda Supabase porque proporciona:

* auth (correo electrónico, OAuth, magic links)
* seguridad a nivel de fila
* auditabilidad
* fácil integración con servicios backend

***

#### Airtm (Cuenta Financiera y KYC)

Manejado íntegramente por **Airtm**.

Responsabilidades:

* KYC y cumplimiento
* creación de cuentas financieras
* saldos
* depósitos (recargas)
* retiros (pagos)
* cuentas bancarias virtuales y pasarelas locales

OfferHub no **no** almacena:

* documentos de identidad
* detalles bancarios
* saldos

***

#### Trustless Work (Escrow y Aplicación)

Manejado por **Trustless Work en Stellar**.

Responsabilidades:

* creación de escrow por orden
* seguimiento de hitos
* estados de disputa
* aplicación de liberaciones y reembolsos

Trustless Work nunca gestiona a los usuarios directamente. Solo aplica **roles y firmas**.

***

### Flujo de Creación de Usuario (Referencia)

#### Paso 1 — Registro e Inicio de Sesión

```
Usuario → UI de OfferHub
UI de OfferHub → Supabase Auth
Supabase → Sesión de usuario establecida
```

En este punto:

* el usuario existe en OfferHub
* el usuario tiene un registro de perfil
* aún no se permiten acciones financieras

#### Paso 2 — Vinculación de Cuenta Airtm (KYC)

Cuando el usuario intenta una acción financiera (recarga, venta, retiro):

```
OfferHub → Verificar: ¿Airtm vinculada?
Si NO:
  → Redirigir al usuario al onboarding alojado por Airtm
```

El usuario completa en Airtm:

* registro o inicio de sesión
* verificación de identidad (KYC)
* preparación de la cuenta

***

#### Paso 3 — Callback y Vinculación de Airtm

```
Airtm → redirección/callback a OfferHub
OfferHub recibe:
  - airtm_user_id (o referencia)
```

OfferHub almacena la referencia en Supabase:

```json
{
  "user_id": "offerhub_user_123",
  "airtm_user_id": "airtm_user_abc"
}
```

No se almacenan credenciales ni saldos.

***

#### Paso 4 — Usuario Habilitado Financieramente

Después de la vinculación:

* el usuario puede recargar saldo
* el usuario puede financiar escrows
* el usuario puede recibir pagos

Todas las acciones financieras se orquestan a través de las APIs de Airtm usando la identidad vinculada.

***

### Por qué se usa este modelo

#### Por qué Supabase maneja los perfiles

* La identidad del marketplace ≠ identidad financiera
* Control de acceso más limpio
* Gestión de roles más sencilla (comprador / vendedor)
* Evita la expansión del alcance de cumplimiento

#### Por qué Airtm maneja KYC

* Entidad regulada
* Diseñado específicamente para el cumplimiento financiero
* Evita duplicar los flujos de KYC

#### Por qué OfferHub solo orquesta

* Reduce el riesgo legal y técnico
* Mantiene la arquitectura modular
* Hace que la plantilla sea reutilizable con otros proveedores

***

### Diagrama de Secuencia (Simplificado)

```
Usuario → UI → Supabase (registro/inicio de sesión)
Usuario → UI → Airtm (onboarding KYC)
Airtm → OfferHub (referencia del usuario)
OfferHub → Supabase (vinculación almacenada)
```

***

### Restricción de Diseño (Importante)

OfferHub **no debe**:

* crear usuarios de Airtm vía API
* almacenar documentos KYC
* actuar como custodio

Si una plataforma requiere control custodial completo, OfferHub no es el patrón correcto.

***

### Resumen

OfferHub trata:

* **Supabase** como el sistema de registro para usuarios
* **Airtm** como el sistema de registro para el dinero
* **Trustless Work** como el sistema de registro para la aplicación de escrow

OfferHub en sí permanece como una capa de orquestación.
