Coin Venture
Binance · ticker/24hr en vivo

Coin Venture

Exchange de criptomonedas multiplataforma en Flutter, con precios en vivo de Binance y balances liquidados en Firestore

Fintech / Trading de criptomonedas2025Proyecto personal funcional en repositorio público; sin despliegue web ni publicación en tiendas

Rol · Desarrollo integral: arquitectura Clean + BLoC, sistema de diseño propio, integración con la API pública de Binance y capa de datos sobre Firebase

BTC/USDT67.482,10+2,41 %ETH/USDT3.284,55+1,08 %BNB/USDT604,12-0,74 %SOL/USDT172,39+4,62 %XRP/USDT0,5218-1,35 %ADA/USDT0,4471+0,92 %DOGE/USDT0,1284-2,18 %AVAX/USDT34,17+3,05 %LINK/USDT17,62+0,46 %TRX/BUSD0,1622-0,31 %DOT/USDC6,84+1,74 %MATIC/FDUSD0,7031-0,88 %BTC/USDT67.482,10+2,41 %ETH/USDT3.284,55+1,08 %BNB/USDT604,12-0,74 %SOL/USDT172,39+4,62 %XRP/USDT0,5218-1,35 %ADA/USDT0,4471+0,92 %DOGE/USDT0,1284-2,18 %AVAX/USDT34,17+3,05 %LINK/USDT17,62+0,46 %TRX/BUSD0,1622-0,31 %DOT/USDC6,84+1,74 %MATIC/FDUSD0,7031-0,88 %
00 / La sesiónCoin Venture es una aplicación Flutter única que corre en web, Android, iOS, macOS, Windows y Linux, y que reproduce el flujo completo de un exchange: iniciar sesión, explorar mercados, abrir el detalle de un activo, operar y revisar el historial.

Los precios no son simulados: la app consume los endpoints públicos `/api/v3/ticker/24hr` y `/api/v3/klines` de Binance a través de Dio, refresca el listado cada 30 segundos y dibuja un sparkline de 168 velas horarias (7 días) por cada par en pantalla.

La liquidación de una orden se resuelve dentro de una transacción de Firestore: valida fondos, actualiza el mapa de balances del usuario y escribe el mismo movimiento en las subcolecciones `transactions` y `orders`, todo de forma atómica.

El código sigue Clean Architecture estricta: 6 módulos de features, cada uno partido en `domain`, `data` y `presentation`, con 16 casos de uso, 6 repositorios abstractos y 16 data sources conectados con get_it.

La navegación usa go_router con un `AuthGuard` que escucha el stream de sesión de Firebase y redirige automáticamente entre `/login` y `/home/markets`, más feature flags que montan o desmontan rutas completas en tiempo de arranque.

01 / El descuadre

Tres frentes que rara vez conviven

El problema

Construir un exchange de criptomonedas exige tres cosas que raramente conviven en un proyecto pequeño: datos de mercado reales y frescos, un motor de saldos que no pueda descuadrarse, y una sola base de código que sirva igual en navegador y en móvil. Las alternativas obvias fallan en algún punto: mockear precios convierte la app en una maqueta sin valor, y liquidar órdenes con lecturas y escrituras sueltas contra la base de datos abre la puerta a saldos negativos o a operaciones registradas dos veces.

La solución

Coin Venture resuelve cada frente con una decisión explícita. Los datos vienen de la API pública de Binance mediante un cliente Dio con reintentos escalonados (500 ms, 1 s, 2 s) y timeouts de 10 s, filtrados a pares con cotización soportada (USDT, BUSD, USDC, FDUSD, TRY) y recortados al top 10 para no saturar la vista. Los saldos viven en el documento `users/{uid}` de Firestore y se mueven únicamente dentro de `runTransaction`, que rechaza la orden si no hay fondos y escribe balance, transacción y orden en el mismo commit. Y toda la app es un único proyecto Flutter con seis targets de plataforma, un sistema de diseño propio (colores, tipografía, espaciado y siete widgets compartidos) y una capa de almacenamiento de sesión que cambia sola entre `flutter_secure_storage` en nativo y `SharedPreferences` en web.

02 / El motor

Seis piezas que sostienen el precio

Datos que llegan solos, saldos que no se descuadran y una única base de código para seis plataformas.

Mercados en vivo desde Binance

Un Timer periódico en el MarketsBloc dispara un refresco cada 30 segundos contra `/api/v3/ticker/24hr`, recalcula capitalización agregada, volumen 24 h, dominancia de BTC y número de monedas, y repinta la tabla sin mostrar el spinner cuando ya hay datos en pantalla.

Liquidación atómica en Firestore

`FirestoreTradeDataSource.persistOrder` corre dentro de `runTransaction`: valida fondos con un margen de 1e-9, ajusta los saldos de base y cotización, y escribe el movimiento en `users/{uid}/transactions` y `users/{uid}/orders` en el mismo commit. Si algo falla, nada se aplica.

Clean Architecture de seis módulos

auth, markets, wallet, trade, history y settings, cada uno con sus capas domain/data/presentation. 12 entidades, 16 casos de uso, 6 repositorios abstractos con implementaciones intercambiables y `Either<Failure, T>` de dartz como contrato de error en toda la app.

Sparklines de 7 días dibujadas a mano

Para cada par visible se piden 168 velas horarias en paralelo con `Future.wait` y se renderizan con un CustomPainter propio: trazo redondeado, relleno degradado del 35 % al 5 % y color verde o rojo según el signo de la variación de 24 h.

Sesión protegida por guard reactivo

`AuthGuard` extiende ChangeNotifier y se suscribe al stream de usuario de Firebase; go_router lo usa como `refreshListenable` y `redirect`, de modo que cerrar sesión expulsa al login desde cualquier ruta sin código extra en las pantallas.

Un código, seis plataformas

El repositorio incluye targets de Android, iOS, web, macOS, Windows y Linux. Las diferencias de plataforma se aíslan en fábricas: `TokenStore.create()` elige almacenamiento seguro o SharedPreferences según `kIsWeb`, y el datasource de auth ajusta persistencia e inicialización de Google Sign-In del mismo modo.

03 / El muro de velas

El repositorio, cotizado

Cada cifra contable del proyecto dibujada como una vela: cuerpo, mecha y una escala que sólo mide código.

115

archivos Dart en lib/

7.821

líneas de código Dart

6

módulos de features con capas domain/data/presentation

8

rutas registradas en go_router

115
7.821
6
8
16
8
16
12
6
30 s
168
archivos Dart en lib/líneas de código Dartmódulos de features con capas domain/data/presentationrutas registradas en go_routercasos de uso de dominioblocs y cubitsdata sources implementadosentidades de dominioplataformas objetivo del proyectointervalo de refresco automático de mercadosvelas de 1 h por sparkline (7 días)

Arrastra en horizontal para recorrer las once velas.

04 / Las pantallas

La sala de trading, recreada

Reconstrucción en HTML y CSS de las pantallas reales: mismos colores, misma disposición, mismos textos.

coin-venture · /home/markets
Coin Venture
MercadosPortafolioHistorialAjustes
AjustesASArturo Sojodev@epale.chat

Mercados de Criptomonedas

Actualización automática cada 30 segundos

Actualizar
Cap. Total$2,41 B
Vol. 24h$98,4 B
BTC Dom.54,2 %
Monedas10
Buscar por nombre o símboloNombrePrecio% 24hVolumen 24h
#MonedaPrecio24h %Cap. MercadoVolumenÚltimos 7 días
1BTCBTCUSDT$67.482,10+2,41 %$1,33 B$28,4 B
2ETHETHUSDT$3.284,55+1,08 %$394,7 M$12,9 B
3BNBBNBUSDT$604,12-0,74 %$88,1 M$1,7 B
4SOLSOLUSDT$172,39+4,62 %$79,4 M$3,2 B
5XRPXRPUSDT$0,5218-1,35 %$29,0 M$1,1 B
6ADAADAUSDT$0,4471+0,92 %$15,8 M$486,2 M
7DOGEDOGEUSDT$0,1284-2,18 %$18,4 M$912,7 M
8AVAXAVAXUSDT$34,17+3,05 %$13,1 M$374,9 M

Mercados — tabla en vivo con sparkline de 168 velas por par

Coin Venture

Inicia sesión en tu cuenta

tu@email.com
••••••••
Iniciar sesión
O continúa con
Google

¿No tienes cuenta? Regístrate

Login

BTCBTCUSDTDatos en vivo y trading

Precio actual

$67.482,10

+2,41 %Rango 24h: $65.910,00 — $68.204,55

Gráfico de precio (1h)

Estadísticas del activo

Cap. Mercado$1,33 B
Volumen 24h$28,4 B
Precio Apertura$65.894,20
Dominio estimado54,2 %

Trading

ComprarVender
0,0125BTC
Precio$67.482,10
Total$843,53
Disponible$4.120,00 USDT
Comprar

Detalle de activo y trading

Mi Portafolio

Resumen de tus activos y balance

$12.480,35

Activos4Activo mayorBTCDiversificaciónDiversificado

Balances

BBTC0,1420362,4 %
EETH1,8504021,1 %
UUSDT1.240,009,9 %
SSOL12,40106,6 %

Portafolio

Historial de operaciones

Registro completo de tus transacciones

18Operaciones11Compras7Ventas
BTCUSDTCompra · 0,01250$843,53$67.482,10
SOLUSDTCompra · 4,20000$724,04$172,39
ETHUSDTVenta · 0,40000$1.313,82$3.284,55
ADAUSDTCompra · 820,0000$366,62$0,4471
XRPUSDTVenta · 500,0000$260,90$0,5218

Sin transacciones aún

Comienza a operar para ver tu historial aquí

Historial de operaciones

Arrastra para ver las cuatro pantallas móviles.

Las maquetas reproducen la interfaz real; los datos que muestran son de ejemplo.

05 / Funcionalidades

El libro de lo que ya funciona

Dieciséis funcionalidades del repositorio, listadas como el libro de órdenes de la propia app.

#Función
01Registro e inicio de sesión con correo y contraseña sobre Firebase Auth, con validación de formulario en cliente (correo con @, contraseña mínima de 6 caracteres)
02Inicio de sesión con Google mediante google_sign_in, con inicialización diferida distinta en web y en nativo
03Cierre de sesión desde la barra superior, que limpia el token almacenado y devuelve al login por redirección automática
04Listado de mercados con las 10 mejores parejas, actualización automática cada 30 segundos y botón de refresco manual
05Buscador por símbolo y cuatro criterios de orden en chips: nombre, precio, variación 24 h y volumen 24 h
06Fila de métricas agregadas: capitalización total, volumen 24 h, dominancia estimada de BTC y número de monedas listadas
07Sparkline de 7 días por fila, coloreada en verde o rojo según la variación del par
08Detalle de activo con precio actual, badge de variación 24 h, rango mínimo-máximo del período y gráfico de precio de 1 h
09Panel de estadísticas del activo: capitalización, volumen 24 h, precio de apertura y dominio estimado
10Trading embebido en el detalle: selector comprar/vender, campo de cantidad, cálculo automático del total y saldo disponible del lado correspondiente
11Pantalla de trading dedicada con selección de par, panel de gráfico y formulario de orden en layout de dos columnas por encima de 1000 px
12Portafolio con valor total agregado, número de activos, activo mayoritario y etiqueta de diversificación (Concentrado / Balanceado / Diversificado)
13Historial de operaciones con contadores de total, compras y ventas, y estado vacío ilustrado cuando aún no hay movimientos
14Ajustes persistidos en Firestore: perfil, notificaciones, doble factor, biometría, idioma, moneda y visibilidad de secciones
15Feature flags de arranque que activan o desactivan las rutas de historial y ajustes, y el refresco automático
16Reintentos automáticos de red con backoff escalonado e inyección del token de sesión como cabecera Authorization en cada petición
06 / Arquitectura

Tres carriles, seis módulos

Pasa el cursor por un carril o por un módulo: la intersección es exactamente el archivo que existe en el repositorio.

features/
BlocBlocBlocBlocBlocBloc
UseCaseUseCaseUseCaseUseCaseUseCaseUseCase
DataSrcDataSrcDataSrcDataSrcDataSrcDataSrc

entidades puras · repositorio abstracto · casos de uso invocables

lib/ al completo

Monorepo Flutter con `lib/` dividido en tres zonas. `core/` concentra lo transversal: configuración (`AppEnv` con flavor por `String.fromEnvironment`, `FeatureFlags`, tema Material 3), inyección de dependencias (`configureDependencies()` registra con get_it el entorno, Dio, FirebaseAuth, FirebaseFirestore, los data sources, los repositorios, los 16 casos de uso y los blocs como factories), red (`buildDioClient` con AuthInterceptor y RetryInterceptor), errores (`Failure`/`Exception` tipados), enrutado (`AppRouter` + `AuthGuard`), seguridad (`TokenStore` con fábrica web/nativo) y utilidades (`Formatters` sobre intl, `Debouncer`). `features/` agrupa seis módulos —auth, markets, wallet, trade, history, settings— y cada uno repite el mismo triple corte: `domain` con entidades puras, repositorio abstracto y casos de uso invocables; `data` con modelos de mapeo, data sources concretos (Binance sobre Dio, Firestore, y variantes mock para auth y trade) e implementación del repositorio que devuelve `Either<Failure, T>`; y `presentation` con bloc/cubit, eventos, estados y páginas. `shared/` aporta el sistema de diseño: `AppColors`, `AppTypography` (Poppins, nueve escalas), `AppSpacing` y siete widgets reutilizables (AppPage, AppCard, AppButton con cuatro variantes, AppTextField, AppSectionHeader, AppShell y MiniSparkline). La navegación es un `GoRouter` con `/login` y `/register` sueltos y un `ShellRoute` que envuelve `/home/markets`, `/home/markets/:symbol`, `/home/portfolio`, `/home/trade` y —según feature flags— `/home/history` y `/home/settings` dentro del `AppShell` con barra superior fija. En Firestore, cada usuario es un documento `users/{uid}` con un mapa `balances`, un objeto de ajustes y las subcolecciones `transactions` y `orders`.

Firestore

users/{uid}
├─ balances { BTC, ETH, USDT… }
├─ settings { perfil, idioma… }
├─ transactions/
│    └─ {orderId}
└─ orders/
     └─ {orderId}

Balance, transacción y orden se escriben en el mismo commit de runTransaction. Si algo falla, nada se aplica.

07 / Retos técnicos

Seis cosas que costaron

Toca cada fila para ver cómo se resolvió.

Solución

Toda la liquidación se movió dentro de `_firestore.runTransaction`: se lee el documento del usuario, se valida que haya fondos con una tolerancia de 1e-9 (lanzando `CacheException` con mensaje legible si no los hay), se ajustan los saldos de base y cotización, y se escriben en el mismo commit la actualización de balances, el documento en `transactions` y el documento en `orders`, ambos con el id de la orden.

08 / Stack

Los chips de la barra de orden

Cada dependencia con la misma forma que los filtros de la tabla de mercados.

Núcleo

Flutter (SDK Dart >=3.3.0 <4.0.0)DartMaterial 3

Estado y arquitectura

flutter_bloc 8.1equatable 2.0dartz 0.10 (Either/Failure)get_it 7.6injectable 2.3

Red y datos

dio 5.4dio_smart_retry 5.0API pública de Binance (ticker/24hr y klines)intl 0.18

Backend y autenticación

firebase_core 4.2firebase_auth 6.1cloud_firestore 6.0google_sign_in 7.2

Persistencia local

flutter_secure_storage 9.0shared_preferences 2.2hive / hive_flutter (declarados)local_auth 2.1 (declarado)

Navegación y UI

go_router 13.1fl_chart 0.66 (declarado; los gráficos actuales son CustomPainter propio)cached_network_image 3.3cupertino_icons 1.0universal_html 2.2

Herramientas de desarrollo

build_runner 2.4freezed 2.4json_serializable 6.7injectable_generator 2.4bloc_test 9.1mocktail 1.0golden_toolkit 0.15flutter_lints 3.0

Plataformas objetivo

AndroidiOSWebmacOSWindowsLinux
AndroidiOSWebmacOSWindowsLinuxUn solo códigoAndroidiOSWebmacOSWindowsLinuxUn solo código

Coin Venture

¿Quieres algo así para tu producto?

Precios reales de Binance, saldos que se mueven sólo dentro de una transacción y un mismo código corriendo en seis plataformas. Si tu producto necesita datos de mercado en vivo o un motor de saldos que no se descuadre, es terreno conocido.