Ethereum Developer Program

NFTs dinámicos con Chainlink Automation

Ethereum Developer Program

Contenido del curso

NFTs dinámicos con Chainlink Automation

Resumen

Los NFTs dinámicos cambian su apariencia o atributos según condiciones externas, y con Chainlink Automation puedes lograr que esa transformación ocurra sola, sin que nadie presione un botón. Si estás construyendo en Web3 y quieres que tus contratos inteligentes ejecuten lógica de forma autónoma, este flujo te muestra cómo combinar OpenZeppelin, IPFS y Chainlink para mintear un NFT que evolucione entre tres estados de manera automática.

¿Por qué los smart contracts necesitan Chainlink Automation?

A pesar del nombre, los smart contracts no son tan inteligentes: no pueden autoejecutar funciones por sí mismos. Necesitan que alguien o algo dispare la transacción. Ahí es donde entra Chainlink Automation, un servicio que ejecuta funciones de tu contrato cuando se cumplen condiciones que tú defines [04:30].

Un caso real es Aave, el protocolo de lending que usa Automation para liquidar colaterales cuando el factor de salud cae por debajo de uno. Sin este servicio, alguien tendría que estar revisando manualmente cada posición.

¿Qué es Chainlink Automation? Es un servicio descentralizado que ejecuta funciones de tus contratos inteligentes cuando se cumple una condición lógica o un horario calendarizado, sin intervención manual.

¿Qué tipos de disparadores puedes configurar?

Automation funciona bajo dos modalidades principales [05:45]:

  • Basada en lógica: una condición programada en tu contrato, como un intervalo de tiempo transcurrido.
  • Basada en calendarización: ejecutar funciones en horarios fijos, por ejemplo todos los lunes a las 10:00 a.m.

¿Cómo funcionan checkUpkeep y performUpkeep?

La arquitectura de Automation se apoya en dos funciones que viven dentro de tu contrato. La primera, checkUpkeep, es consultada por un nodo off chain que pregunta de forma constante si la condición se cumple. La segunda, performUpkeep, es la que ejecuta la lógica cuando la respuesta es afirmativa [06:30].

Una recomendación importante es revalidar dentro de performUpkeep la misma condición que ya verificó checkUpkeep. Esto protege tu contrato ante cualquier inconsistencia entre la consulta off chain y la ejecución on chain.

¿Cómo construir un NFT dinámico paso a paso?

El ejemplo trabaja con un ERC-721 que pasa por tres estados visuales, como si fuera la evolución de un Pokémon: Charmander, Charmeleon y Charizard. Para arrancar rápido, conviene usar el wizard de OpenZeppelin, una herramienta que genera contratos ERC-20, ERC-721 y ERC-1155 con un par de clics [10:15].

En el wizard activas tres opciones clave: mintable, auto increment IDs y URI storage. Eso te entrega un contrato listo para abrir directamente en Remix.

¿Qué es la metadata y por qué importa la URI?

La metadata es información sobre la información: describe qué es tu NFT, cómo se llama, qué imagen lo representa y qué atributos tiene. Esta información vive en un archivo JSON al que se accede mediante una URI [13:00].

El estándar de OpenSea define los campos esperados:

  • name: nombre del NFT.
  • description: descripción visible en marketplaces.
  • image: enlace a la imagen.
  • external_url: referencia opcional externa.
  • attributes: propiedades como nivel, color o rareza.

Si armas mal este JSON, tu NFT no se visualiza correctamente en plataformas como OpenSea.

¿Dónde almacenar las imágenes y archivos JSON?

En Web3 lo coherente es usar almacenamiento descentralizado. Aquí entra IPFS (Interplanetary File System), una red de nodos que hashea tu archivo, lo divide en pedazos y lo distribuye [15:30]. Para subirlo, el ejemplo usa Pinata, un proveedor que facilita el proceso.

Un detalle clave: sube las imágenes como carpeta. Pinata genera un único hash para todo el folder y luego identifica cada archivo con un slash y su nombre. Así mantienes tus tres estados agrupados.

¿Qué es una gateway de IPFS? Es la puerta de entrada que traduce el protocolo IPFS al HTTPS que usamos en internet. Puedes usar gateway.pinata.cloud o ipfs.io indistintamente para acceder al mismo contenido.

¿Cómo se programa la lógica del NFT dinámico en Solidity?

Dentro del contrato se declara un enum llamado Status con los valores first, second y third. Aunque parezcan etiquetas, internamente equivalen a 0, 1 y 2, igual que las posiciones de un arreglo [22:00].

Luego se crea un arreglo de strings llamado ipfsUri que guarda las tres URIs de la metadata, y un mapping que asocia cada tokenId con su estado actual. La función getUriByLevel devuelve la URI correspondiente según el estado, y la función tokenURI se sobreescribe para apoyarse en esa lógica.

¿Cómo se actualiza el estado de cada NFT?

La función updateStatus recibe un tokenId, consulta su estado actual con getStatus y aplica la transición:

  • Si está en 0, sube a 1.
  • Si está en 1, sube a 2.
  • Si está en 2, regresa a 0 para crear un loop de ejemplo.

Después se programa updateAllNfts, que itera con un for y actualiza todos los NFTs minteados. Una advertencia práctica: usar for sobre arreglos dinámicos no escala bien si tienes cientos de NFTs, porque puede consumir demasiado gas [32:00].

¿Cómo se integra Chainlink Automation en el contrato?

El contrato debe importar AutomationCompatible.sol desde @chainlink/contracts y heredar de AutomationCompatibleInterface. Dentro de checkUpkeep se valida si la diferencia entre block.timestamp y lastTimeStamp supera el intervalo definido. Si la respuesta es true, performUpkeep ejecuta updateAllNfts y reinicia el contador de tiempo [38:00].

El intervalo se pasa por el constructor: en el ejemplo se usaron 60 segundos para ver la evolución rápido.

¿Cómo registrar el upkeep y pagar con LINK?

Una vez desplegado el contrato en Mumbai, se obtienen tokens LINK de prueba en faucets.chain.link. Después se entra a automation.chain.link y se registra un nuevo upkeep con la opción custom logic, pegando la dirección del contrato, asignando un gas limit y depositando LINK como saldo de operación [48:00].

Desde ese momento, los nodos de Chainlink monitorean tu contrato y ejecutan performUpkeep cada vez que se cumple la condición. Cada ejecución descuenta una pequeña fracción de LINK del balance, y si se agota, el servicio se detiene.

¿Qué casos de uso reales tienen los servicios de Chainlink?

Más allá del ejemplo, los productos de Chainlink se aplican en escenarios concretos del mercado:

  • Real world assets: tokenización de casas o vehículos cuyo valor cambia con el tiempo y necesita reflejarse en el NFT.
  • DeFi: protocolos como Synthetix y Aave usan Automation para liquidar posiciones que no cumplen su factor de salud.
  • Gaming: VRF genera números aleatorios verificables criptográficamente, útiles para calcular probabilidades de ataques o loot.
  • Derivados sintéticos: los price feeds permiten traer precios de activos como el oro al contrato y tokenizarlos.

El único límite real está en cómo combines estos productos con tu idea. ¿Qué proyecto te imaginas construyendo con NFTs dinámicos?