| name | nft-development |
| description | Master NFT development with token standards, metadata, marketplaces, and on-chain art |
| sasmp_version | 1.3.0 |
| version | 2.0.0 |
| updated | 2025-01 |
| bonded_agent | 07-nft-development |
| bond_type | PRIMARY_BOND |
| atomic | true |
| single_responsibility | nft_development |
| parameters | {"topic":{"type":"string","required":true,"enum":["standards","metadata","marketplace","onchain"]},"standard":{"type":"string","default":"ERC721","enum":["ERC721","ERC721A","ERC1155","DN404"]}} |
| retry_config | {"max_attempts":3,"backoff":"exponential","initial_delay_ms":1000} |
| logging | {"level":"info","include_timestamps":true,"track_usage":true} |
NFT Development Skill
Master NFT development with token standards, metadata design, marketplace integration, and on-chain generative art.
Quick Start
Skill("nft-development", topic="standards", standard="ERC721A")
Topics Covered
1. Token Standards
Choose the right standard:
- ERC-721: Standard NFTs, one token per ID
- ERC-721A: Gas-optimized batch minting
- ERC-1155: Multi-token, semi-fungible
- DN404: Divisible NFT hybrid
2. Metadata Design
Structure your NFT data:
- On-chain: Base64 JSON, SVG
- IPFS: Content-addressed storage
- Arweave: Permanent storage
- Dynamic: Evolving traits
3. Marketplace Integration
List and sell NFTs:
- OpenSea: Seaport protocol
- Royalties: EIP-2981
- Operator Filter: Royalty enforcement
- Collection Verification: Metadata standards
4. On-Chain Art
Generate art in Solidity:
- SVG Generation: Dynamic shapes
- Seed-based: Deterministic randomness
- Traits: Rarity distribution
- Base64: Data URI encoding
Code Examples
ERC-721A Mint
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "erc721a/contracts/ERC721A.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyNFT is ERC721A, Ownable {
uint256 public constant MAX_SUPPLY = 10000;
uint256 public constant PRICE = 0.08 ether;
error MaxSupplyReached();
error InsufficientPayment();
constructor() ERC721A("MyNFT", "MNFT") Ownable(msg.sender) {}
function mint(uint256 quantity) external payable {
if (_totalMinted() + quantity > MAX_SUPPLY) revert MaxSupplyReached();
if (msg.value < PRICE * quantity) revert InsufficientPayment();
_mint(msg.sender, quantity);
}
function _startTokenId() internal pure override returns (uint256) {
return 1;
}
}