ASD

Nft Standards

Implementa estándares NFT (ERC-721, ERC-1155) con manejo correcto de metadata, estrategias de minting e integración con marketplaces.

Estrellas
38.8k

en todo el repo

Actividad
47

0–100, la ruta de este skill

Actualizado
hace 2 meses

último commit aquí

Commits
1

últimos 90 días

Contexto
1.9k tok

56 tok en reposo

Paquete
2 archivos

10 KB

Instalar

Funciona con cualquier agente que lea SKILL.md

npx -y skills add wshobson/agents --skill nft-standards --agent claude-code

Se instala solo en este repositorio.

Qué hace

  • Provee contratos Solidity plantilla para ERC-721 y ERC-1155 con minting, supply máximo y precios
  • Muestra manejo de metadata off-chain (IPFS) y on-chain codificada en Base64
  • Incluye implementación de royalties según EIP-2981 con royaltyInfo configurable

Úsalo cuando

  • Crear colecciones NFT (arte, gaming, coleccionables)
  • Implementar funcionalidad de marketplace
  • Construir metadata on-chain u off-chain
  • Implementar royalties y reparto de ingresos

No lo uses cuando

    Qué lo activa

    Di cualquiera de estas frases y el agente debería cargar este skill.

    • Crea un contrato ERC-721 para mintear una colección de arte con royalties
    • Necesito un contrato ERC-1155 para items de un juego con supply máximo
    • Cómo genero metadata on-chain codificada en base64 para mi NFT

    SKILL.md

    En inglés

    NFT Standards

    Master ERC-721 and ERC-1155 NFT standards, metadata best practices, and advanced NFT features.

    When to Use This Skill

    • Creating NFT collections (art, gaming, collectibles)
    • Implementing marketplace functionality
    • Building on-chain or off-chain metadata
    • Creating soulbound tokens (non-transferable)
    • Implementing royalties and revenue sharing
    • Developing dynamic/evolving NFTs

    ERC-721 (Non-Fungible Token Standard)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
    import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
    import "@openzeppelin/contracts/access/Ownable.sol";
    import "@openzeppelin/contracts/utils/Counters.sol";
    
    contract MyNFT is ERC721URIStorage, ERC721Enumerable, Ownable {
        using Counters for Counters.Counter;
        Counters.Counter private _tokenIds;
    
        uint256 public constant MAX_SUPPLY = 10000;
        uint256 public constant MINT_PRICE = 0.08 ether;
        uint256 public constant MAX_PER_MINT = 20;
    
        constructor() ERC721("MyNFT", "MNFT") {}
    
        function mint(uint256 quantity) external payable {
            require(quantity > 0 && quantity <= MAX_PER_MINT, "Invalid quantity");
            require(_tokenIds.current() + quantity <= MAX_SUPPLY, "Exceeds max supply");
            require(msg.value >= MINT_PRICE * quantity, "Insufficient payment");
    
            for (uint256 i = 0; i < quantity; i++) {
                _tokenIds.increment();
                uint256 newTokenId = _tokenIds.current();
                _safeMint(msg.sender, newTokenId);
                _setTokenURI(newTokenId, generateTokenURI(newTokenId));
            }
        }
    
        function generateTokenURI(uint256 tokenId) internal pure returns (string memory) {
            // Return IPFS URI or on-chain metadata
            return string(abi.encodePacked("ipfs://QmHash/", Strings.toString(tokenId), ".json"));
        }
    
        // Required overrides
        function _beforeTokenTransfer(
            address from,
            address to,
            uint256 tokenId,
            uint256 batchSize
        ) internal override(ERC721, ERC721Enumerable) {
            super._beforeTokenTransfer(from, to, tokenId, batchSize);
        }
    
        function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
            super._burn(tokenId);
        }
    
        function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
            return super.tokenURI(tokenId);
        }
    
        function supportsInterface(bytes4 interfaceId)
            public
            view
            override(ERC721, ERC721Enumerable)
            returns (bool)
        {
            return super.supportsInterface(interfaceId);
        }
    
        function withdraw() external onlyOwner {
            payable(owner()).transfer(address(this).balance);
        }
    }
    

    ERC-1155 (Multi-Token Standard)

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    
    import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
    import "@openzeppelin/contracts/access/Ownable.sol";
    
    contract GameItems is ERC1155, Ownable {
        uint256 public constant SWORD = 1;
        uint256 public constant SHIELD = 2;
        uint256 public constant POTION = 3;
    
        mapping(uint256 => uint256) public tokenSupply;
        mapping(uint256 => uint256) public maxSupply;
    
        constructor() ERC1155("ipfs://QmBaseHash/{id}.json") {
            maxSupply[SWORD] = 1000;
            maxSupply[SHIELD] = 500;
            maxSupply[POTION] = 10000;
        }
    
        function mint(
            address to,
            uint256 id,
            uint256 amount
        ) external onlyOwner {
            require(tokenSupply[id] + amount <= maxSupply[id], "Exceeds max supply");
    
            _mint(to, id, amount, "");
            tokenSupply[id] += amount;
        }
    
        function mintBatch(
            address to,
            uint256[] memory ids,
            uint256[] memory amounts
        ) external onlyOwner {
            for (uint256 i = 0; i < ids.length; i++) {
                require(tokenSupply[ids[i]] + amounts[i] <= maxSupply[ids[i]], "Exceeds max supply");
                tokenSupply[ids[i]] += amounts[i];
            }
    
            _mintBatch(to, ids, amounts, "");
        }
    
        function burn(
            address from,
            uint256 id,
            uint256 amount
        ) external {
            require(from == msg.sender || isApprovedForAll(from, msg.sender), "Not authorized");
            _burn(from, id, amount);
            tokenSupply[id] -= amount;
        }
    }
    

    Metadata Standards

    Off-Chain Metadata (IPFS)

    {
      "name": "NFT #1",
      "description": "Description of the NFT",
      "image": "ipfs://QmImageHash",
      "attributes": [
        {
          "trait_type": "Background",
          "value": "Blue"
        },
        {
          "trait_type": "Rarity",
          "value": "Legendary"
        },
        {
          "trait_type": "Power",
          "value": 95,
          "display_type": "number",
          "max_value": 100
        }
      ]
    }
    

    On-Chain Metadata

    contract OnChainNFT is ERC721 {
        struct Traits {
            uint8 background;
            uint8 body;
            uint8 head;
            uint8 rarity;
        }
    
        mapping(uint256 => Traits) public tokenTraits;
    
        function tokenURI(uint256 tokenId) public view override returns (string memory) {
            Traits memory traits = tokenTraits[tokenId];
    
            string memory json = Base64.encode(
                bytes(
                    string(
                        abi.encodePacked(
                            '{"name": "NFT #', Strings.toString(tokenId), '",',
                            '"description": "On-chain NFT",',
                            '"image": "data:image/svg+xml;base64,', generateSVG(traits), '",',
                            '"attributes": [',
                            '{"trait_type": "Background", "value": "', Strings.toString(traits.background), '"},',
                            '{"trait_type": "Rarity", "value": "', getRarityName(traits.rarity), '"}',
                            ']}'
                        )
                    )
                )
            );
    
            return string(abi.encodePacked("data:application/json;base64,", json));
        }
    
        function generateSVG(Traits memory traits) internal pure returns (string memory) {
            // Generate SVG based on traits
            return "...";
        }
    }
    

    Royalties (EIP-2981)

    import "@openzeppelin/contracts/interfaces/IERC2981.sol";
    
    contract NFTWithRoyalties is ERC721, IERC2981 {
        address public royaltyRecipient;
        uint96 public royaltyFee = 500; // 5%
    
        constructor() ERC721("Royalty NFT", "RNFT") {
            royaltyRecipient = msg.sender;
        }
    
        function royaltyInfo(uint256 tokenId, uint256 salePrice)
            external
            view
            override
            returns (address receiver, uint256 royaltyAmount)
        {
            return (royaltyRecipient, (salePrice * royaltyFee) / 10000);
        }
    
        function setRoyalty(address recipient, uint96 fee) external onlyOwner {
            require(fee <= 1000, "Royalty fee too high"); // Max 10%
            royaltyRecipient = recipient;
            royaltyFee = fee;
        }
    
        function supportsInterface(bytes4 interfaceId)
            public
            view
            override(ERC721, IERC165)
            returns (bool)
        {
            return interfaceId == type(IERC2981).interfaceId ||
                   super.supportsInterface(interfaceId);
        }
    }
    

    Additional patterns and templates

    More detailed templates and worked examples live in references/details.md. Read that file for the full pattern library.

    Reproducido de wshobson/agents bajo licencia MIT. Leer esta página en markdown.

    Archivos

    2 archivos en el paquete. Solo se lee SKILL.md al activarse — las referencias se cargan si el skill decide que las necesita.

    Antes de instalar

    Requiere Solidity y las librerías de OpenZeppelin (@openzeppelin/contracts).

    Detalles

    Creador
    wshobson
    Licencia
    MIT
    Recursos incluidos
    referencias
    Repositorio
    wshobson/agents
    Código fuente
    Ver SKILL.md

    Etiquetas

    Más de wshobson/agents

    Este repo incluye 180 skills. Si instalas uno, normalmente ya tienes los demás.

    Úsalo al seleccionar y colocar iconos, imágenes, SVGs, diagramas o infografías de apoyo aprobados en un PPTX editable.

    Costo de contexto al activarse
    344 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo cuando pidan optimizar un prompt, mejorar su rendimiento, diseñar una plantilla, aplicar chain-of-thought, few-shot prompting o técnicas avanzadas de prompt engineering para producción.

    Costo de contexto al activarse
    1.3k tok
    Tamaño del paquete
    10 archivos
    Última actualización
    el mes pasado
    herramientas desarrollo

    Úsalo al redactar o reparar una especificación JSON con coordenadas explícitas para un PPTX editable.

    Costo de contexto al activarse
    489 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo para validar o reparar un PPTX editable en cuanto a geometría, accesibilidad, editabilidad nativa, linaje de fuente e integridad del paquete OOXML.

    Costo de contexto al activarse
    409 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo para analizar un PPTX de referencia en modo solo lectura: estructura, tema, tipografía, ritmo de layout, diagnósticos, catálogos de plantillas derivados o inspección segura del paquete OOXML.

    Costo de contexto al activarse
    689 tok
    Tamaño del paquete
    8 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo al preparar la narrativa, las fuentes y el contexto de diseño para un nuevo deck PPTX editable.

    Costo de contexto al activarse
    415 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Skills relacionados

    Integra el procesamiento de pagos de PayPal, con soporte para express checkout, suscripciones y gestión de reembolsos en flujos de comercio electrónico.

    Costo de contexto al activarse
    1k tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 2 meses
    desarrollo apis

    Construye sistemas RAG (Retrieval-Augmented Generation) para aplicaciones LLM con bases de datos vectoriales y búsqueda semántica, integrando conocimiento externo.

    Costo de contexto al activarse
    1.1k tok
    Tamaño del paquete
    2 archivos
    Última actualización
    el mes pasado
    desarrollo apis

    Construye servicios backend de Node.js listos para producción con Express/Fastify, cubriendo middleware, manejo de errores, autenticación, bases de datos y diseño de APIs.

    Costo de contexto al activarse
    499 tok
    Tamaño del paquete
    3 archivos
    Última actualización
    hace 2 meses
    desarrollo apis