[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71SW6E6PQD3WG00Z5BFVAJM":3,"skill-same:01M71SW6E6PQD3WG00Z5BFVAJM":58},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":13,"repositoryHtmlUrl":41,"repositoryHomepageUrl":6,"ownerHtmlUrl":42,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":43,"install":44,"resources":57},"01M71SW6E6PQD3WG00Z5BFVAJM","nft-standards",null,"Implement NFT standards (ERC-721, ERC-1155) with proper metadata handling, minting strategies, and marketplace integration. Use when creating NFT contracts, building NFT marketplaces, or implementi...","javiertarazon\u002Fide-agente-free-jt7-","javiertarazon","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F153141207?v=4","01M71R52TB3S9HXKH6WSNT8A7V","01M71R52VG5KS2DKDDH4GDQ30A",0,"MIT","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fnft-standards\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32],"standards","nft","nft standards","community","use","when","unknown","implement","with","strategies","marketplace","integration","minting","contracts","metadata","2026-11-10 13:02:02",false,"---\nname: nft-standards\ndescription: \"Implement NFT standards (ERC-721, ERC-1155) with proper metadata handling, minting strategies, and marketplace integration. Use when creating NFT contracts, building NFT marketplaces, or implementi...\"\nrisk: unknown\nsource: community\n---\n\n# NFT Standards\n\nMaster ERC-721 and ERC-1155 NFT standards, metadata best practices, and advanced NFT features.\n\n## Do not use this skill when\n\n- The task is unrelated to nft standards\n- You need a different domain or tool outside this scope\n\n## Instructions\n\n- Clarify goals, constraints, and required inputs.\n- Apply relevant best practices and validate outcomes.\n- Provide actionable steps and verification.\n- If detailed examples are required, open `resources\u002Fimplementation-playbook.md`.\n\n## Use this skill when\n\n- Creating NFT collections (art, gaming, collectibles)\n- Implementing marketplace functionality\n- Building on-chain or off-chain metadata\n- Creating soulbound tokens (non-transferable)\n- Implementing royalties and revenue sharing\n- Developing dynamic\u002Fevolving NFTs\n\n## ERC-721 (Non-Fungible Token Standard)\n\n```solidity\n\u002F\u002F SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin\u002Fcontracts\u002Ftoken\u002FERC721\u002Fextensions\u002FERC721URIStorage.sol\";\nimport \"@openzeppelin\u002Fcontracts\u002Ftoken\u002FERC721\u002Fextensions\u002FERC721Enumerable.sol\";\nimport \"@openzeppelin\u002Fcontracts\u002Faccess\u002FOwnable.sol\";\nimport \"@openzeppelin\u002Fcontracts\u002Futils\u002FCounters.sol\";\n\ncontract MyNFT is ERC721URIStorage, ERC721Enumerable, Ownable {\n    using Counters for Counters.Counter;\n    Counters.Counter private _tokenIds;\n\n    uint256 public constant MAX_SUPPLY = 10000;\n    uint256 public constant MINT_PRICE = 0.08 ether;\n    uint256 public constant MAX_PER_MINT = 20;\n\n    constructor() ERC721(\"MyNFT\", \"MNFT\") {}\n\n    function mint(uint256 quantity) external payable {\n        require(quantity > 0 && quantity \u003C= MAX_PER_MINT, \"Invalid quantity\");\n        require(_tokenIds.current() + quantity \u003C= MAX_SUPPLY, \"Exceeds max supply\");\n        require(msg.value >= MINT_PRICE * quantity, \"Insufficient payment\");\n\n        for (uint256 i = 0; i \u003C quantity; i++) {\n            _tokenIds.increment();\n            uint256 newTokenId = _tokenIds.current();\n            _safeMint(msg.sender, newTokenId);\n            _setTokenURI(newTokenId, generateTokenURI(newTokenId));\n        }\n    }\n\n    function generateTokenURI(uint256 tokenId) internal pure returns (string memory) {\n        \u002F\u002F Return IPFS URI or on-chain metadata\n        return string(abi.encodePacked(\"ipfs:\u002F\u002FQmHash\u002F\", Strings.toString(tokenId), \".json\"));\n    }\n\n    \u002F\u002F Required overrides\n    function _beforeTokenTransfer(\n        address from,\n        address to,\n        uint256 tokenId,\n        uint256 batchSize\n    ) internal override(ERC721, ERC721Enumerable) {\n        super._beforeTokenTransfer(from, to, tokenId, batchSize);\n    }\n\n    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {\n        super._burn(tokenId);\n    }\n\n    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {\n        return super.tokenURI(tokenId);\n    }\n\n    function supportsInterface(bytes4 interfaceId)\n        public\n        view\n        override(ERC721, ERC721Enumerable)\n        returns (bool)\n    {\n        return super.supportsInterface(interfaceId);\n    }\n\n    function withdraw() external onlyOwner {\n        payable(owner()).transfer(address(this).balance);\n    }\n}\n```\n\n## ERC-1155 (Multi-Token Standard)\n\n```solidity\n\u002F\u002F SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin\u002Fcontracts\u002Ftoken\u002FERC1155\u002FERC1155.sol\";\nimport \"@openzeppelin\u002Fcontracts\u002Faccess\u002FOwnable.sol\";\n\ncontract GameItems is ERC1155, Ownable {\n    uint256 public constant SWORD = 1;\n    uint256 public constant SHIELD = 2;\n    uint256 public constant POTION = 3;\n\n    mapping(uint256 => uint256) public tokenSupply;\n    mapping(uint256 => uint256) public maxSupply;\n\n    constructor() ERC1155(\"ipfs:\u002F\u002FQmBaseHash\u002F{id}.json\") {\n        maxSupply[SWORD] = 1000;\n        maxSupply[SHIELD] = 500;\n        maxSupply[POTION] = 10000;\n    }\n\n    function mint(\n        address to,\n        uint256 id,\n        uint256 amount\n    ) external onlyOwner {\n        require(tokenSupply[id] + amount \u003C= maxSupply[id], \"Exceeds max supply\");\n\n        _mint(to, id, amount, \"\");\n        tokenSupply[id] += amount;\n    }\n\n    function mintBatch(\n        address to,\n        uint256[] memory ids,\n        uint256[] memory amounts\n    ) external onlyOwner {\n        for (uint256 i = 0; i \u003C ids.length; i++) {\n            require(tokenSupply[ids[i]] + amounts[i] \u003C= maxSupply[ids[i]], \"Exceeds max supply\");\n            tokenSupply[ids[i]] += amounts[i];\n        }\n\n        _mintBatch(to, ids, amounts, \"\");\n    }\n\n    function burn(\n        address from,\n        uint256 id,\n        uint256 amount\n    ) external {\n        require(from == msg.sender || isApprovedForAll(from, msg.sender), \"Not authorized\");\n        _burn(from, id, amount);\n        tokenSupply[id] -= amount;\n    }\n}\n```\n\n## Metadata Standards\n\n### Off-Chain Metadata (IPFS)\n\n```json\n{\n  \"name\": \"NFT #1\",\n  \"description\": \"Description of the NFT\",\n  \"image\": \"ipfs:\u002F\u002FQmImageHash\",\n  \"attributes\": [\n    {\n      \"trait_type\": \"Background\",\n      \"value\": \"Blue\"\n    },\n    {\n      \"trait_type\": \"Rarity\",\n      \"value\": \"Legendary\"\n    },\n    {\n      \"trait_type\": \"Power\",\n      \"value\": 95,\n      \"display_type\": \"number\",\n      \"max_value\": 100\n    }\n  ]\n}\n```\n\n### On-Chain Metadata\n\n```solidity\ncontract OnChainNFT is ERC721 {\n    struct Traits {\n        uint8 background;\n        uint8 body;\n        uint8 head;\n        uint8 rarity;\n    }\n\n    mapping(uint256 => Traits) public tokenTraits;\n\n    function tokenURI(uint256 tokenId) public view override returns (string memory) {\n        Traits memory traits = tokenTraits[tokenId];\n\n        string memory json = Base64.encode(\n            bytes(\n                string(\n                    abi.encodePacked(\n                        '{\"name\": \"NFT #', Strings.toString(tokenId), '\",',\n                        '\"description\": \"On-chain NFT\",',\n                        '\"image\": \"data:image\u002Fsvg+xml;base64,', generateSVG(traits), '\",',\n                        '\"attributes\": [',\n                        '{\"trait_type\": \"Background\", \"value\": \"', Strings.toString(traits.background), '\"},',\n                        '{\"trait_type\": \"Rarity\", \"value\": \"', getRarityName(traits.rarity), '\"}',\n                        ']}'\n                    )\n                )\n            )\n        );\n\n        return string(abi.encodePacked(\"data:application\u002Fjson;base64,\", json));\n    }\n\n    function generateSVG(Traits memory traits) internal pure returns (string memory) {\n        \u002F\u002F Generate SVG based on traits\n        return \"...\";\n    }\n}\n```\n\n## Royalties (EIP-2981)\n\n```solidity\nimport \"@openzeppelin\u002Fcontracts\u002Finterfaces\u002FIERC2981.sol\";\n\ncontract NFTWithRoyalties is ERC721, IERC2981 {\n    address public royaltyRecipient;\n    uint96 public royaltyFee = 500; \u002F\u002F 5%\n\n    constructor() ERC721(\"Royalty NFT\", \"RNFT\") {\n        royaltyRecipient = msg.sender;\n    }\n\n    function royaltyInfo(uint256 tokenId, uint256 salePrice)\n        external\n        view\n        override\n        returns (address receiver, uint256 royaltyAmount)\n    {\n        return (royaltyRecipient, (salePrice * royaltyFee) \u002F 10000);\n    }\n\n    function setRoyalty(address recipient, uint96 fee) external onlyOwner {\n        require(fee \u003C= 1000, \"Royalty fee too high\"); \u002F\u002F Max 10%\n        royaltyRecipient = recipient;\n        royaltyFee = fee;\n    }\n\n    function supportsInterface(bytes4 interfaceId)\n        public\n        view\n        override(ERC721, IERC165)\n        returns (bool)\n    {\n        return interfaceId == type(IERC2981).interfaceId ||\n               super.supportsInterface(interfaceId);\n    }\n}\n```\n\n## Soulbound Tokens (Non-Transferable)\n\n```solidity\ncontract SoulboundToken is ERC721 {\n    constructor() ERC721(\"Soulbound\", \"SBT\") {}\n\n    function _beforeTokenTransfer(\n        address from,\n        address to,\n        uint256 tokenId,\n        uint256 batchSize\n    ) internal virtual override {\n        require(from == address(0) || to == address(0), \"Token is soulbound\");\n        super._beforeTokenTransfer(from, to, tokenId, batchSize);\n    }\n\n    function mint(address to) external {\n        uint256 tokenId = totalSupply() + 1;\n        _safeMint(to, tokenId);\n    }\n\n    \u002F\u002F Burn is allowed (user can destroy their SBT)\n    function burn(uint256 tokenId) external {\n        require(ownerOf(tokenId) == msg.sender, \"Not token owner\");\n        _burn(tokenId);\n    }\n}\n```\n\n## Dynamic NFTs\n\n```solidity\ncontract DynamicNFT is ERC721 {\n    struct TokenState {\n        uint256 level;\n        uint256 experience;\n        uint256 lastUpdated;\n    }\n\n    mapping(uint256 => TokenState) public tokenStates;\n\n    function gainExperience(uint256 tokenId, uint256 exp) external {\n        require(ownerOf(tokenId) == msg.sender, \"Not token owner\");\n\n        TokenState storage state = tokenStates[tokenId];\n        state.experience += exp;\n\n        \u002F\u002F Level up logic\n        if (state.experience >= state.level * 100) {\n            state.level++;\n        }\n\n        state.lastUpdated = block.timestamp;\n    }\n\n    function tokenURI(uint256 tokenId) public view override returns (string memory) {\n        TokenState memory state = tokenStates[tokenId];\n\n        \u002F\u002F Generate metadata based on current state\n        return generateMetadata(tokenId, state);\n    }\n\n    function generateMetadata(uint256 tokenId, TokenState memory state)\n        internal\n        pure\n        returns (string memory)\n    {\n        \u002F\u002F Dynamic metadata generation\n        return \"\";\n    }\n}\n```\n\n## Gas-Optimized Minting (ERC721A)\n\n```solidity\nimport \"erc721a\u002Fcontracts\u002FERC721A.sol\";\n\ncontract OptimizedNFT is ERC721A {\n    uint256 public constant MAX_SUPPLY = 10000;\n    uint256 public constant MINT_PRICE = 0.05 ether;\n\n    constructor() ERC721A(\"Optimized NFT\", \"ONFT\") {}\n\n    function mint(uint256 quantity) external payable {\n        require(_totalMinted() + quantity \u003C= MAX_SUPPLY, \"Exceeds max supply\");\n        require(msg.value >= MINT_PRICE * quantity, \"Insufficient payment\");\n\n        _mint(msg.sender, quantity);\n    }\n\n    function _baseURI() internal pure override returns (string memory) {\n        return \"ipfs:\u002F\u002FQmBaseHash\u002F\";\n    }\n}\n```\n\n## Resources\n\n- **references\u002Ferc721.md**: ERC-721 specification details\n- **references\u002Ferc1155.md**: ERC-1155 multi-token standard\n- **references\u002Fmetadata-standards.md**: Metadata best practices\n- **references\u002Fenumeration.md**: Token enumeration patterns\n- **assets\u002Ferc721-contract.sol**: Production ERC-721 template\n- **assets\u002Ferc1155-contract.sol**: Production ERC-1155 template\n- **assets\u002Fmetadata-schema.json**: Standard metadata format\n- **assets\u002Fmetadata-uploader.py**: IPFS upload utility\n\n## Best Practices\n\n1. **Use OpenZeppelin**: Battle-tested implementations\n2. **Pin Metadata**: Use IPFS with pinning service\n3. **Implement Royalties**: EIP-2981 for marketplace compatibility\n4. **Gas Optimization**: Use ERC721A for batch minting\n5. **Reveal Mechanism**: Placeholder → reveal pattern\n6. **Enumeration**: Support walletOfOwner for marketplaces\n7. **Whitelist**: Merkle trees for efficient whitelisting\n\n## Marketplace Integration\n\n- OpenSea: ERC-721\u002F1155, metadata standards\n- LooksRare: Royalty enforcement\n- Rarible: Protocol fees, lazy minting\n- Blur: Gas-optimized trading\n","# NFT Standards\n\nMaster ERC-721 and ERC-1155 NFT standards, metadata best practices, and advanced NFT features.\n\n## Do not use this skill when\n\n- The task is unrelated to nft standards\n- You need a different domain or tool outside this scope\n\n## Instructions\n\n- Clarify goals, constraints, and required inputs.\n- Apply relevant best practices and validate outcomes.\n- Provide actionable steps and verification.\n- If detailed examples are required, open `resources\u002Fimplementation-playbook.md`.\n\n## Use this skill when\n\n- Creating NFT collections (art, gaming, collectibles)\n- Implementing marketplace functionality\n- Building on-chain or off-chain metadata\n- Creating soulbound tokens (non-transferable)\n- Implementing royalties and revenue sharing\n- Developing dynamic\u002Fevolving NFTs\n\n## ERC-721 (Non-Fungible Token Standard)\n\n```solidity\n\u002F\u002F SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin\u002Fcontracts\u002Ftoken\u002FERC721\u002Fextensions\u002FERC721URIStorage.sol\";\nimport \"@openzeppelin\u002Fcontracts\u002Ftoken\u002FERC721\u002Fextensions\u002FERC721Enumerable.sol\";\nimport \"@openzeppelin\u002Fcontracts\u002Faccess\u002FOwnable.sol\";\nimport \"@openzeppelin\u002Fcontracts\u002Futils\u002FCounters.sol\";\n\ncontract MyNFT is ERC721URIStorage, ERC721Enumerable, Ownable {\n    using Counters for Counters.Counter;\n    Counters.Counter private _tokenIds;\n\n    uint256 public constant MAX_SUPPLY = 10000;\n    uint256 public constant MINT_PRICE = 0.08 ether;\n    uint256 public constant MAX_PER_MINT = 20;\n\n    constructor() ERC721(\"MyNFT\", \"MNFT\") {}\n\n    function mint(uint256 quantity) external payable {\n        require(quantity > 0 && quantity \u003C= MAX_PER_MINT, \"Invalid quantity\");\n        require(_tokenIds.current() + quantity \u003C= MAX_SUPPLY, \"Exceeds max supply\");\n        require(msg.value >= MINT_PRICE * quantity, \"Insufficient payment\");\n\n        for (uint256 i = 0; i \u003C quantity; i++) {\n            _tokenIds.increment();\n            uint256 newTokenId = _tokenIds.current();\n            _safeMint(msg.sender, newTokenId);\n            _setTokenURI(newTokenId, generateTokenURI(newTokenId));\n        }\n    }\n\n    function generateTokenURI(uint256 tokenId) internal pure returns (string memory) {\n        \u002F\u002F Return IPFS URI or on-chain metadata\n        return string(abi.encodePacked(\"ipfs:\u002F\u002FQmHash\u002F\", Strings.toString(tokenId), \".json\"));\n    }\n\n    \u002F\u002F Required overrides\n    function _beforeTokenTransfer(\n        address from,\n        address to,\n        uint256 tokenId,\n        uint256 batchSize\n    ) internal override(ERC721, ERC721Enumerable) {\n        super._beforeTokenTransfer(from, to, tokenId, batchSize);\n    }\n\n    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {\n        super._burn(tokenId);\n    }\n\n    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {\n        return super.tokenURI(tokenId);\n    }\n\n    function supportsInterface(bytes4 interfaceId)\n        public\n        view\n        override(ERC721, ERC721Enumerable)\n        returns (bool)\n    {\n        return super.supportsInterface(interfaceId);\n    }\n\n    function withdraw() external onlyOwner {\n        payable(owner()).transfer(address(this).balance);\n    }\n}\n```\n\n## ERC-1155 (Multi-Token Standard)\n\n```solidity\n\u002F\u002F SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin\u002Fcontracts\u002Ftoken\u002FERC1155\u002FERC1155.sol\";\nimport \"@openzeppelin\u002Fcontracts\u002Faccess\u002FOwnable.sol\";\n\ncontract GameItems is ERC1155, Ownable {\n    uint256 public constant SWORD = 1;\n    uint256 public constant SHIELD = 2;\n    uint256 public constant POTION = 3;\n\n    mapping(uint256 => uint256) public tokenSupply;\n    mapping(uint256 => uint256) public maxSupply;\n\n    constructor() ERC1155(\"ipfs:\u002F\u002FQmBaseHash\u002F{id}.json\") {\n        maxSupply[SWORD] = 1000;\n        maxSupply[SHIELD] = 500;\n        maxSupply[POTION] = 10000;\n    }\n\n    function mint(\n        address to,\n        uint256 id,\n        uint256 amount\n    ) external onlyOwner {\n        require(tokenSupply[id] + amount \u003C= maxSupply[id], \"Exceeds max supply\");\n\n        _mint(to, id, amount, \"\");\n        tokenSupply[id] += amount;\n    }\n\n    function mintBatch(\n        address to,\n        uint256[] memory ids,\n        uint256[] memory amounts\n    ) external onlyOwner {\n        for (uint256 i = 0; i \u003C ids.length; i++) {\n            require(tokenSupply[ids[i]] + amounts[i] \u003C= maxSupply[ids[i]], \"Exceeds max supply\");\n            tokenSupply[ids[i]] += amounts[i];\n        }\n\n        _mintBatch(to, ids, amounts, \"\");\n    }\n\n    function burn(\n        address from,\n        uint256 id,\n        uint256 amount\n    ) external {\n        require(from == msg.sender || isApprovedForAll(from, msg.sender), \"Not authorized\");\n        _burn(from, id, amount);\n        tokenSupply[id] -= amount;\n    }\n}\n```\n\n## Metadata Standards\n\n### Off-Chain Metadata (IPFS)\n\n```json\n{\n  \"name\": \"NFT #1\",\n  \"description\": \"Description of the NFT\",\n  \"image\": \"ipfs:\u002F\u002FQmImageHash\",\n  \"attributes\": [\n    {\n      \"trait_type\": \"Background\",\n      \"value\": \"Blue\"\n    },\n    {\n      \"trait_type\": \"Rarity\",\n      \"value\": \"Legendary\"\n    },\n    {\n      \"trait_type\": \"Power\",\n      \"value\": 95,\n      \"display_type\": \"number\",\n      \"max_value\": 100\n    }\n  ]\n}\n```\n\n### On-Chain Metadata\n\n```solidity\ncontract OnChainNFT is ERC721 {\n    struct Traits {\n        uint8 background;\n        uint8 body;\n        uint8 head;\n        uint8 rarity;\n    }\n\n    mapping(uint256 => Traits) public tokenTraits;\n\n    function tokenURI(uint256 tokenId) public view override returns (string memory) {\n        Traits memory traits = tokenTraits[tokenId];\n\n        string memory json = Base64.encode(\n            bytes(\n                string(\n                    abi.encodePacked(\n                        '{\"name\": \"NFT #', Strings.toString(tokenId), '\",',\n                        '\"description\": \"On-chain NFT\",',\n                        '\"image\": \"data:image\u002Fsvg+xml;base64,', generateSVG(traits), '\",',\n                        '\"attributes\": [',\n                        '{\"trait_type\": \"Background\", \"value\": \"', Strings.toString(traits.background), '\"},',\n                        '{\"trait_type\": \"Rarity\", \"value\": \"', getRarityName(traits.rarity), '\"}',\n                        ']}'\n                    )\n                )\n            )\n        );\n\n        return string(abi.encodePacked(\"data:application\u002Fjson;base64,\", json));\n    }\n\n    function generateSVG(Traits memory traits) internal pure returns (string memory) {\n        \u002F\u002F Generate SVG based on traits\n        return \"...\";\n    }\n}\n```\n\n## Royalties (EIP-2981)\n\n```solidity\nimport \"@openzeppelin\u002Fcontracts\u002Finterfaces\u002FIERC2981.sol\";\n\ncontract NFTWithRoyalties is ERC721, IERC2981 {\n    address public royaltyRecipient;\n    uint96 public royaltyFee = 500; \u002F\u002F 5%\n\n    constructor() ERC721(\"Royalty NFT\", \"RNFT\") {\n        royaltyRecipient = msg.sender;\n    }\n\n    function royaltyInfo(uint256 tokenId, uint256 salePrice)\n        external\n        view\n        override\n        returns (address receiver, uint256 royaltyAmount)\n    {\n        return (royaltyRecipient, (salePrice * royaltyFee) \u002F 10000);\n    }\n\n    function setRoyalty(address recipient, uint96 fee) external onlyOwner {\n        require(fee \u003C= 1000, \"Royalty fee too high\"); \u002F\u002F Max 10%\n        royaltyRecipient = recipient;\n        royaltyFee = fee;\n    }\n\n    function supportsInterface(bytes4 interfaceId)\n        public\n        view\n        override(ERC721, IERC165)\n        returns (bool)\n    {\n        return interfaceId == type(IERC2981).interfaceId ||\n               super.supportsInterface(interfaceId);\n    }\n}\n```\n\n## Soulbound Tokens (Non-Transferable)\n\n```solidity\ncontract SoulboundToken is ERC721 {\n    constructor() ERC721(\"Soulbound\", \"SBT\") {}\n\n    function _beforeTokenTransfer(\n        address from,\n        address to,\n        uint256 tokenId,\n        uint256 batchSize\n    ) internal virtual override {\n        require(from == address(0) || to == address(0), \"Token is soulbound\");\n        super._beforeTokenTransfer(from, to, tokenId, batchSize);\n    }\n\n    function mint(address to) external {\n        uint256 tokenId = totalSupply() + 1;\n        _safeMint(to, tokenId);\n    }\n\n    \u002F\u002F Burn is allowed (user can destroy their SBT)\n    function burn(uint256 tokenId) external {\n        require(ownerOf(tokenId) == msg.sender, \"Not token owner\");\n        _burn(tokenId);\n    }\n}\n```\n\n## Dynamic NFTs\n\n```solidity\ncontract DynamicNFT is ERC721 {\n    struct TokenState {\n        uint256 level;\n        uint256 experience;\n        uint256 lastUpdated;\n    }\n\n    mapping(uint256 => TokenState) public tokenStates;\n\n    function gainExperience(uint256 tokenId, uint256 exp) external {\n        require(ownerOf(tokenId) == msg.sender, \"Not token owner\");\n\n        TokenState storage state = tokenStates[tokenId];\n        state.experience += exp;\n\n        \u002F\u002F Level up logic\n        if (state.experience >= state.level * 100) {\n            state.level++;\n        }\n\n        state.lastUpdated = block.timestamp;\n    }\n\n    function tokenURI(uint256 tokenId) public view override returns (string memory) {\n        TokenState memory state = tokenStates[tokenId];\n\n        \u002F\u002F Generate metadata based on current state\n        return generateMetadata(tokenId, state);\n    }\n\n    function generateMetadata(uint256 tokenId, TokenState memory state)\n        internal\n        pure\n        returns (string memory)\n    {\n        \u002F\u002F Dynamic metadata generation\n        return \"\";\n    }\n}\n```\n\n## Gas-Optimized Minting (ERC721A)\n\n```solidity\nimport \"erc721a\u002Fcontracts\u002FERC721A.sol\";\n\ncontract OptimizedNFT is ERC721A {\n    uint256 public constant MAX_SUPPLY = 10000;\n    uint256 public constant MINT_PRICE = 0.05 ether;\n\n    constructor() ERC721A(\"Optimized NFT\", \"ONFT\") {}\n\n    function mint(uint256 quantity) external payable {\n        require(_totalMinted() + quantity \u003C= MAX_SUPPLY, \"Exceeds max supply\");\n        require(msg.value >= MINT_PRICE * quantity, \"Insufficient payment\");\n\n        _mint(msg.sender, quantity);\n    }\n\n    function _baseURI() internal pure override returns (string memory) {\n        return \"ipfs:\u002F\u002FQmBaseHash\u002F\";\n    }\n}\n```\n\n## Resources\n\n- **references\u002Ferc721.md**: ERC-721 specification details\n- **references\u002Ferc1155.md**: ERC-1155 multi-token standard\n- **references\u002Fmetadata-standards.md**: Metadata best practices\n- **references\u002Fenumeration.md**: Token enumeration patterns\n- **assets\u002Ferc721-contract.sol**: Production ERC-721 template\n- **assets\u002Ferc1155-contract.sol**: Production ERC-1155 template\n- **assets\u002Fmetadata-schema.json**: Standard metadata format\n- **assets\u002Fmetadata-uploader.py**: IPFS upload utility\n\n## Best Practices\n\n1. **Use OpenZeppelin**: Battle-tested implementations\n2. **Pin Metadata**: Use IPFS with pinning service\n3. **Implement Royalties**: EIP-2981 for marketplace compatibility\n4. **Gas Optimization**: Use ERC721A for batch minting\n5. **Reveal Mechanism**: Placeholder → reveal pattern\n6. **Enumeration**: Support walletOfOwner for marketplaces\n7. **Whitelist**: Merkle trees for efficient whitelisting\n\n## Marketplace Integration\n\n- OpenSea: ERC-721\u002F1155, metadata standards\n- LooksRare: Royalty enforcement\n- Rarible: Protocol fees, lazy minting\n- Blur: Gas-optimized trading\n",{"name":5,"risk":24,"source":21,"description":7},"release\u002Fv4.2.11-panel-pro","a92ea02bcf7e2b3dbaf46d49696c29a3cb490d4f",".github\u002Fskills\u002Fnft-standards","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-","https:\u002F\u002Fgithub.com\u002Fjaviertarazon","2026-07-12 07:10:45",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add javiertarazon\u002Fide-agente-free-jt7- --skill nft-standards",{"tool":50,"command":51},"bunx","bunx skills add javiertarazon\u002Fide-agente-free-jt7- --skill nft-standards",{"tool":53,"command":54},"pnpm","pnpm dlx skills add javiertarazon\u002Fide-agente-free-jt7- --skill nft-standards","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fnft-standards\u002FSKILL.md",true,[],[59,86,113,133,148,170],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":70,"publishedAt":33},"01M71TQ7Q6Z10VWF3C2H5X1KW9","zustand-store-ts","Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state\u002Faction separation. Use when building React state management, creating global stores, or implementing reacti...","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzustand-store-ts\u002FSKILL.md",[65],{"categoryNo":66,"categoryName":67,"taxonomyType":68,"taxonomyTypeDesc":69},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[71,72,73,21,74,75,22,76,23,24,77,26,78,79,80,81,82,83,84,85],"zustand","store","zustand store ts","middleware","implementing","react state management","react","state","create","state management","typescript","action","management","separation","global",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":95,"publishedAt":33},"01M71TQ5EAR40G6W0MV5ZDVEZT","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzoom-automation\u002FSKILL.md",[92],{"categoryNo":93,"categoryName":94,"taxonomyType":68,"taxonomyTypeDesc":69},"01JBSEEDCAT000000000000023","Skill与智能体开发",[96,97,98,21,99,100,101,102,103,24,104,105,106,107,108,109,110,111,83,112],"zoom automation","zoom","automation","creation","for","search","schemas","MCP","first","via","meeting","search tools","tracking","webinars","composio","recordings","Tools",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":120,"publishedAt":33},"01M71TQ29B1EYBCEAP1ZBGXQ1A","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzoho-crm-automation\u002FSKILL.md",[119],{"categoryNo":93,"categoryName":94,"taxonomyType":68,"taxonomyTypeDesc":69},[121,122,98,123,124,125,21,126,127,100,128,101,102,129,103,24,130,131,132,79],"crm automation","zoho crm automation","crm","zoho crm","zoho","leads","manage leads","manage","records","convert","tasks","contacts",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":140,"publishedAt":33},"01M71TPZPMN60DH0XV58KVHY23","zendesk-automation","Automate Zendesk tasks via Rube MCP (Composio): tickets, users, organizations, replies. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzendesk-automation\u002FSKILL.md",[139],{"categoryNo":93,"categoryName":94,"taxonomyType":68,"taxonomyTypeDesc":69},[141,98,142,21,100,101,102,103,143,24,131,144,145,104,105,146,107,110,112,147],"zendesk automation","zendesk","organizations","replies","users","tickets","automate",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":33},"01M71TPXDWKHKG4N6TVEPXWD0N","zapier-make-patterns","No-code automation democratizes workflow building. Zapier and Make (formerly Integromat) let non-developers automate business processes without writing code. But no-code doesn't mean no-complexity ...","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzapier-make-patterns\u002FSKILL.md",[],[155,156,157,158,159,160,161,162,163,98,164,24,165,166,167,168,169,147],"zapier make patterns","zapier","patterns","make","No-Code","complexity","writing","spawner","business","workflow","code","integromat","apache","processes","but",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":179,"publishedAt":33},"01M71TPT5T10WXNKW9G7ZXZ27W","youtube-summarizer","Extract transcripts from YouTube videos and generate comprehensive, detailed summaries using intelligent analysis frameworks","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fyoutube-summarizer\u002FSKILL.md",[176],{"categoryNo":177,"categoryName":178,"taxonomyType":68,"taxonomyTypeDesc":69},"01JBSEEDCAT000000000000016","图像与多媒体",[180,181,182,183,21,184,185,186,187,188,189,190,165,191,192,193,194,195,196,197],"summarizer","youtube","youtube summarizer","Video","content-analysis","frameworks","copilot","2025","github-copilot","extract transcripts","analysis","codex","cli","summaries","github","generate","summarization","2026"]