🎨 ERC-721: Crea tu Propio NFT

Non-Fungible Tokens ” cada token es único, como un certificado de propiedad digital

Semanas 3-4: Tokens y Standards
ERC-721 NFT Metadata tokenURI OpenZeppelin
🎨 Piénsalo así: ERC-20 son billetes de banco ” todos los de $1 son idénticos e intercambiables. ERC-721 son como escrituras de propiedad ” cada una identifica una propiedad específica e irrepetible. El token #1 y el token #2 son distintos aunque estén en el mismo contrato. La magia está en el tokenURI: un JSON con imagen, atributos y rareza que convierte un número en un arte digital único. OpenSea, Blur y todos los marketplaces leen este estándar.
📚 Refs: EIP-721 (Dieter Shirley, 2018) ” eips.ethereum.org/EIPS/eip-721 · OpenZeppelin ERC721 Docs

Mint NFT Interactivo

Gas estimado: ~65,000

Colección CryptoArt0 NFTs

Mint tu primer NFT para comenzar la colección

tokenURI Metadata (EIP-721)

// Selecciona un NFT de la colección para ver su metadata

Solidity ” Contrato ERC-721

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Base64.sol";

contract CryptoArt is ERC721, Ownable {
  uint256 private _tokenId;

  struct NFTData {
    string rarity;
    string palette;
    uint256 power;
  }
  mapping(uint256 => NFTData) public nftData;

  constructor() ERC721("CryptoArt", "CART") Ownable(msg.sender) {}

  function safeMint(address to) external onlyOwner {
    uint256 id = ++_tokenId;
    nftData[id] = NFTData("Rare", "Neon", 85);
    _safeMint(to, id);
  }

  function tokenURI(uint256 id) public view override
    returns (string memory) {
    return string.concat("data:application/json;base64,",
      Base64.encode(abi.encodePacked(
        '{"name":"CryptoArt #', Strings.toString(id),
        '","attributes":[{"trait_type":"Rarity","value":"',
        nftData[id].rarity, '"}]}'
      ))
    );
  }
}
🎨 Mint tu primer NFT y observa cómo se genera el metadata JSON. Cada NFT tiene atributos únicos on-chain.