Euro-Ecommerce: Una Stablecoin Propia para Comercio Descentralizado
Ecosistema completo de e-commerce descentralizado con stablecoin ERC-20 propia (EURT) vinculada al Euro, pagos Stripe, contratos Solidity y dApps web en Next.js.
Más Allá del Simple “Pago en Crypto”
La gran mayoría de los proyectos de e-commerce Web3 simplemente aceptan ETH o USDC como método de pago. Este proyecto va un paso más: emite su propia stablecoin vinculada al Euro (EURT) y construye sobre ella un ecosistema completo de comercio electrónico.
Arquitectura del Ecosistema
El proyecto es un monorepo compuesto por cuatro subproyectos que interactúan entre sí:
ecommerce/
├── sc-ecommerce/ ← Smart Contracts de la tienda (Solidity/Foundry)
├── stablecoin/sc/ ← Smart Contract del token EURT (ERC-20)
├── web-customer/ ← dApp para compradores (Next.js)
└── web-admin/ ← Dashboard de administración (Next.js)
El Token EURT
// Token estable vinculado al Euro
// Precisión: 6 decimales (como USDC, representa céntimos)
// Emisión controlada: solo el owner puede hacer mint
// Estándar: ERC-20 (OpenZeppelin)
La decisión de usar 6 decimales (en lugar de los 18 estándar de ETH) es intencional: representa céntimos de Euro, evitando problemas de truncamiento en los cálculos de precio.
On-ramp Fiat → Crypto
El flujo más interesante es el on-ramp: cómo pasar de dinero fiat al token EURT.
Usuario paga con tarjeta → Stripe procesa el pago
↓
Webhook de Stripe notifica al backend
↓
Backend verifica el pago y llama mint() en el contrato EURT
↓
EURT aparecen en el wallet del usuario
Smart Contracts de la Tienda
El contrato de ecommerce usa una arquitectura de Librerías Modulares en Solidity:
| Librería | Responsabilidad |
|---|---|
CompanyLib |
Registro y activación de comercios |
ProductLib |
CRUD de productos, control de stock on-chain |
CustomerLib |
Registro de clientes |
ShoppingCartLib |
Carrito y cálculo de totales |
Los estados de un pago siguen el patrón estándar de máquinas de estado:
Pending → Completed → (Refunded si es necesario)
↘ Failed
Lecciones Aprendidas
Stripe + Blockchain es un puente fascinante
Conectar el mundo de los pagos tradicionales con la blockchain requiere ser muy cuidadoso con la idempotencia: si el webhook de Stripe se envía dos veces (lo hace por reintentos), el contrato podría hacer mint dos veces. La solución fue registrar el payment_intent_id de Stripe en el contrato para evitar duplicados.
El Admin Panel importa
Un ecosistema DeFi sin un buen panel de administración no escala. El web-admin cubre gestión de inventario, métricas de ventas y registro de nuevas empresas en el contrato.
Código fuente: github.com/87maxi/ecommerce