Construir un mercado descentralizado donde los jugadores puedan publicar y comprar logros usando monedas del juego es una de las aplicaciones más potentes de los contratos inteligentes. Aquí se conectan dos estándares fundamentales del ecosistema blockchain: el ERC-20 para tokens fungibles (monedas) y el ERC-721 para tokens no fungibles (logros o achievements). Todo el flujo se modela en un contrato independiente que actúa como intermediario de confianza.
¿Cómo se resuelve el desafío de duplicar la emisión de monedas?
Antes de entrar al marketplace, había un desafío pendiente: si un jugador ya posee un achievement, la emisión de monedas debe ser el doble. La solución usa la función balance of [01:02], presente en todo token que cumpla con su estándar. Esta función indica cuántos tokens emitidos tiene una cuenta determinada.
- Se consulta el contrato de achievements con
balanceOf sobre la cuenta del ganador.
- Si el balance es mayor a cero, el jugador ya tiene al menos un logro y recibe el doble de monedas.
- Si el balance es cero, la emisión se mantiene normal.
Esta verificación directa entre contratos es un patrón común en Solidity para condicionar lógica según el estado de otro contrato.
¿Cómo se estructura el contrato del marketplace?
El contrato del marketplace se crea por separado y referencia las interfaces de los estándares en lugar de sus implementaciones completas [02:48]. Se importa IERC20 e IERC721 (nótese la letra "i" al inicio), lo que hace el contrato más liviano al traer menos código.
¿Qué estructura de datos almacena las publicaciones?
Toda la información de logros publicados se guarda en un mapping llamado valores [03:24], que relaciona un entero (token ID) con otro entero (precio de venta). Cuando el valor almacenado es cero, significa que ese token ID no está publicado.
Para la función de publicación, se aplican tres validaciones:
- El token ID no debe estar previamente publicado (su valor en el mapping debe ser cero).
- El precio de venta debe ser mayor a cero, ya que el cero se usa como indicador de publicación vacía [04:12].
- El contrato marketplace debe tener aprobación sobre ese token ID, verificada con la función
getApproved [05:02]. Esta función devuelve la dirección autorizada para gestionar el token, y debe coincidir con la dirección del marketplace.
¿Cómo funciona la compra dentro del marketplace?
La función de compra también requiere validaciones antes de ejecutar transferencias [06:01]:
- La publicación debe existir: el valor del token ID tiene que ser distinto de cero.
- El comprador debe haber habilitado al marketplace para gastar sus monedas mediante la función allowance del ERC-20 [06:31]. Esta función verifica que el contrato tenga permiso suficiente para cubrir el precio de venta.
- Se debe confirmar que el vendedor no haya revocado los permisos sobre el achievement después de publicar.
Una vez superadas las validaciones, se ejecutan dos transferencias:
- Transfer from en el contrato de moneda: transfiere desde el comprador (sender) hacia el dueño del logro (obtenido con
ownerOf) la cantidad correspondiente [07:16].
- Safe transfer from en el contrato de achievements: transfiere el NFT desde el vendedor hacia el comprador [07:40].
- Finalmente, el valor del token ID en el mapping se resetea a cero para permitir una futura republicación.
¿Cómo se inicializa y se prueba el marketplace?
Las direcciones de los contratos de moneda y achievement se asocian a las interfaces mediante el constructor [08:18]. Esta es considerada una buena práctica porque garantiza que al momento del deploy las referencias ya estén configuradas. Una alternativa sería usar una función separada que permita cambiar las direcciones posteriormente.
En la demostración práctica con Remix [08:52]:
- El usuario C4 posee una moneda y el usuario B2 posee el logro con token ID 1.
- B2 aprueba al marketplace para gestionar su token ID 1 mediante
approve en el contrato de achievements [09:30].
- C4 aprueba al marketplace para gastar su moneda mediante
approve en el contrato ERC-20 [10:11].
- B2 publica el logro con precio 1.
- C4 ejecuta la compra indicando solo el token ID.
Tras la transacción, C4 tiene balance cero en monedas y es el nuevo dueño del token ID 1. B2 recibió la moneda como pago [10:55]. El flujo completo de compraventa descentralizada quedó validado.
Si lograste implementar el marketplace, el siguiente reto es convertirlo en un modelo de subastas. Comparte tu solución y las variantes que encuentres en los comentarios.