> For the complete documentation index, see [llms.txt](https://edp.ethkipu.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://edp.ethkipu.org/modulo-3/estandares-librerias-y-patrones/erc-721.md).

# ERC-721

El estándar ERC-721, conocido como el estándar para tokens no fungibles (NFTs) en Ethereum, introduce un mecanismo para representar la propiedad y la transferencia de activos únicos. A diferencia de los tokens ERC-20, que son fungibles y cada token es idéntico a los demás, cada token ERC-721 es único, permitiendo así la representación digital de activos únicos y la propiedad de estos en la blockchain.

### **Características Clave del ERC-721**

* **Unicidad:** Cada token tiene un identificador único (a menudo llamado "tokenId") que lo distingue de todos los demás tokens dentro del mismo contrato.
* **Propiedad:** El contrato lleva un registro de quién es el propietario de cada token, permitiendo la propiedad digital verificable de activos únicos.
* **Transferibilidad:** Los tokens pueden ser transferidos entre cuentas, lo que permite el comercio, la venta y la transferencia de propiedad de activos digitales únicos.
* **Interoperabilidad:** El estándar asegura que los tokens NFT sean interoperables con el ecosistema más amplio de Ethereum, incluyendo mercados y otras plataformas que admiten el estándar ERC-721.

El estándar ERC-721 define un conjunto de funciones y eventos que un contrato inteligente debe implementar para ser compatible con ERC-721:

### **Funciones Requeridas:**

* **`balanceOf(address _owner)`**: Devuelve el número de tokens que posee una dirección.
* **`ownerOf(uint256 _tokenId)`**: Devuelve el propietario de un token específico.
* **`transferFrom(address _from, address _to, uint256 _tokenId)`**: Transfiere la propiedad de un token de una dirección a otra.
* **`approve(address _approved, uint256 _tokenId)`**: Permite a una dirección transferir un token específico en nombre del propietario.
* **`getApproved(uint256 _tokenId)`**: Devuelve la dirección autorizada para transferir un token específico.
* **`setApprovalForAll(address _operator, bool _approved)`**: Permite o prohíbe a un operador gestionar todos los tokens de un propietario.
* **`isApprovedForAll(address _owner, address _operator)`**: Consulta si un operador está autorizado a gestionar todos los tokens de un propietario.

### **Eventos Requeridos:**

* **`Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId)`**: Emitido cuando se transfiere la propiedad de un token.
* **`Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId)`**: Emitido cuando se autoriza a una dirección para transferir un token específico.
* **`ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved)`**: Emitido cuando se autoriza o revoca la autorización a un operador para gestionar todos los tokens de un propietario.

<figure><img src="/files/JkAZPlIldk93bhmEFc5G" alt=""><figcaption></figcaption></figure>

### **Implementación y Uso**

Los tokens ERC-721 han ganado popularidad en aplicaciones que requieren la representación de activos únicos y la propiedad verificable en la blockchain, como arte digital, coleccionables, bienes inmuebles virtuales y más. La implementación del estándar ERC-721 permite a los desarrolladores crear contratos inteligentes que gestionan la propiedad, transferencia y acceso a activos digitales únicos, facilitando la creación de un mercado vibrante y diverso de NFTs en Ethereum.
