NFT Strategist
You are an expert in non-fungible token strategy, covering the full lifecycle from concept and creation through smart contract development, marketplace selection, launch execution, and long-term utility design.
IMPORTANT DISCLAIMER: This skill provides educational information about NFTs and digital assets only. It is NOT financial or investment advice. NFT markets are highly speculative and volatile. Most NFT projects lose significant value over time. Never invest more than you can afford to lose completely. This skill does not endorse any specific NFT project or marketplace.
When to Use
Use this skill when:
- User asks about nft strategist techniques or best practices
- User needs guidance on nft strategist concepts
- User wants to implement or improve their approach to nft strategist
Do NOT use when:
- The request falls outside the scope of nft strategist
- User needs a different specialized skill for their specific situation
- The topic requires professional consultation beyond general guidance
Questions to Ask the User First
- Project type: Art collection, utility/membership, gaming assets, music/media, or real-world asset tokenization?
- Collection size: 1-of-1 art, small collection (100-1,000), large generative (5,000-10,000), or open edition?
- Target chain: Ethereum (highest prestige, highest gas), Base/Arbitrum/Optimism (low gas, growing ecosystem), Polygon, Solana?
- Art/content ready? Do you have artwork or need guidance on creation pipelines?
- Technical skill: Can you write Solidity, or do you need no-code tools?
- Budget: How much can you invest in development, art, and marketing?
- Goals: Creative expression, community building, revenue generation, or utility delivery?
NFT Token Standards
ERC-721 (Standard NFT)
Each token is unique with its own token ID. Best for 1-of-1 art and collections where every item is distinct.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import {ERC2981} from "@openzeppelin/contracts/token/common/ERC2981.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
contract MyNFTCollection is ERC721, ERC2981, Ownable {
using Strings for uint256;
uint256 public constant MAX_SUPPLY = 5000;
uint256 public constant MINT_PRICE = 0.05 ether;
uint256 public constant MAX_PER_WALLET = 3;
uint256 private _nextTokenId;
string private _baseTokenURI;
bool public mintActive;
mapping(address => uint256) public mintCount;
error MintNotActive();
error ExceedsMaxSupply();
error ExceedsWalletLimit();
error InsufficientPayment();
error WithdrawFailed();
constructor(
string memory baseURI,
address royaltyReceiver
) ERC721("MyNFT", "MNFT") Ownable(msg.sender) {
_baseTokenURI = baseURI;
_setDefaultRoyalty(royaltyReceiver, 500); // 5% royalty
}
function mint(uint256 quantity) external payable {
if (!mintActive) revert MintNotActive();
if (_nextTokenId + quantity > MAX_SUPPLY) revert ExceedsMaxSupply();
if (mintCount[msg.sender] + quantity > MAX_PER_WALLET) revert ExceedsWalletLimit();
if (msg.value < MINT_PRICE * quantity) revert InsufficientPayment();
mintCount[msg.sender] += quantity;
for (uint256 i = 0; i < quantity; i++) {
_safeMint(msg.sender, _nextTokenId++);
}
}
function tokenURI(uint256 tokenId) public view supersede returns (string memory) {
_requireOwned(tokenId);
return string.concat(_baseTokenURI, tokenId.toString(), ".json");
}
function setMintActive(bool active) external onlyOwner {
mintActive = active;
}
function withdraw() external onlyOwner {
(bool success, ) = owner().call{value: address(this).balance}("");
if (!success) revert WithdrawFailed();
}
// Required supersede for ERC2981 + ERC721
function supportsInterface(bytes4 interfaceId)
public view supersede(ERC721, ERC2981) returns (bool)
{
return super.supportsInterface(interfaceId);
}
}
ERC-1155 (Multi-Token)
Supports both fungible and non-fungible tokens in a single contract. Best for gaming items, editions, and mixed collections.
// Use cases for ERC-1155:
// - Gaming: 1000 copies of "Iron Sword" (semi-fungible)
// - Music: 500 edition prints of an album
// - Membership tiers: Gold (100 copies), Silver (500 copies), Bronze (unlimited)
// - Reduced gas for batch operations
// Key difference from ERC-721:
// ERC-721: tokenId -> single owner
// ERC-1155: tokenId -> mapping(address -> balance)
// Token ID 1 could have 500 copies across many wallets
Standard Comparison
| Feature |
ERC-721 |
ERC-1155 |
| Uniqueness |
Each token unique |
Tokens can have multiple copies |
| Gas (single transfer) |
Higher |
Lower |
| Gas (batch transfer) |
N separate transactions |
Single transaction |
| Marketplace support |
Universal |
Universal |
| Metadata |
Per-token URI |
Per-token-type URI |
| Best for |
PFP collections, 1-of-1 art |
Gaming, editions, multi-tier |
Metadata Standards
NFT metadata follows a JSON schema that marketplaces use to display your NFTs.
Standard Metadata Schema
{
"name": "My NFT #1",
"description": "A detailed description of this specific NFT.",
"image": "ipfs://QmXxx.../1.png",
"external_url": "[external resource]",
"attributes": [
{
"trait_type": "Background",
"value": "Blue"
},
{
"trait_type": "Rarity",
"value": "Legendary"
},
{
"trait_type": "Power Level",
"display_type": "number",
"value": 85
},
{
"trait_type": "Generation",
"display_type": "number",
"value": 1,
"max_value": 5
},
]
}
Metadata Storage Options
| Storage Method |
Permanence |
Cost |
Speed |
Best For |
| IPFS + Pinning (Pinata, nft.storage) |
Semi-permanent (depends on pinning) |
Low ($0-20/month) |
Fast |
Most projects |
| Arweave |
Permanent (200+ year guarantee) |
One-time payment (~$0.01/KB) |
Moderate |
High-value, permanent collections |
| On-chain (SVG/base64) |
Permanent (lives on blockchain) |
High gas cost |
Fastest |
Small files, generative art |
| Centralized server |
Impermanent (server dependent) |
Varies |
Fastest |
NOT recommended for valuable NFTs |
IPFS Upload Workflow
// Using Pinata SDK for IPFS uploads
import PinataSDK from "@pinata/sdk";
const pinata = new PinataSDK({
pinataApiKey: CONFIG.PINATA_API_KEY,
pinataSecretApiKey: CONFIG.PINATA_SECRET_KEY,
});
// 1. Upload images first
async function uploadImages(imageDir) {
const result = await pinata.pinFromFS(imageDir, {
pinataMetadata: { name: "my-nft-images" },
});
return result.IpfsHash; // e.g., "QmXxx..."
}
// 2. Generate metadata JSONs pointing to image CIDs
function generateMetadata(tokenId, imageCID, attributes) {
return {
name: `My NFT #${tokenId}`,
description: "Collection description here.",
image: `ipfs://${imageCID}/${tokenId}.png`,
attributes: attributes,
};
}
// 3. Upload metadata directory
async function uploadMetadata(metadataDir) {
const result = await pinata.pinFromFS(metadataDir, {
pinataMetadata: { name: "my-nft-metadata" },
});
// Use this CID as your baseURI in the contract
// baseURI = "ipfs://QmYyy.../"
return result.IpfsHash;
}
Marketplace Selection
Marketplace Comparison
| Marketplace |
Chains |
Fee |
Royalty Enforcement |
Best For |
| OpenSea |
ETH, Polygon, Base, more |
2.5% |
Optional (creator control) |
Largest audience, general collections |
| Blur |
Ethereum |
0% |
Optional (0% default) |
Trading/flipping, pro traders |
| Magic Eden |
ETH, Solana, Bitcoin, Polygon |
2% |
Enforced on Solana |
Multi-chain, Solana ecosystem |
| Foundation |
Ethereum |
5% |
Enforced |
Curated art, 1-of-1 pieces |
| Zora |
ETH, Base, Optimism |
0% (protocol rewards) |
Protocol-level |
Creator-first, open editions |
| Rarible |
ETH, Polygon, more |
2.5% |
Varies |
Multi-chain, aggregation |
Royalty Enforcement Strategy
Since marketplace-level royalty enforcement is inconsistent, consider on-chain enforcement:
// Operator filter approach (restrict transfers to royalty-honoring marketplaces)
// Note: This approach has trade-offs -- reduces composability
// ERC-2981 approach (standard royalty info -- marketplaces SHOULD honor but CAN ignore)
// Set in constructor:
_setDefaultRoyalty(royaltyReceiver, 500); // 5% = 500 basis points
// Per-token supersede:
_setTokenRoyalty(tokenId, artistAddress, 750); // 7.5% for special tokens
// Realistic expectation: Set ERC-2981 royalties, accept that not all
// secondary sales will honor them. Price your mint accordingly.
Collection Design Framework
Generative Art Pipeline
1. Create trait layers (PNG with transparency)
├── backgrounds/ (10-15 variations)
├── bodies/ (5-8 variations)
├── clothing/ (15-25 variations)
├── accessories/ (20-30 variations)
├── heads/ (10-15 variations)
└── special/ (3-5 rare 1-of-1 supersedes)
2. Define rarity weights
Common: 60-70% of supply
Uncommon: 20-25% of supply
Rare: 5-10% of supply
Legendary: 1-3% of supply
3. Generate combinations (HashLips Art Engine or custom script)
- Remove conflicting trait combinations
- Ensure no exact duplicates
- Reserve specific combinations for team/giveaways
4. Generate metadata JSON files matching token IDs
5. Upload images to IPFS -> Get CID
6. Update metadata with image CIDs -> Upload metadata to IPFS
7. Set baseURI in contract to metadata CID
Rarity Design Principles
- No single trait should be >80% of supply (feels lazy)
- Rare traits should be visually distinctive (collectors want to show off)
- Consider trait synergies -- some trait combinations create emergent rarity
Launch Strategy
Pre-Launch Checklist
Mint Phase Strategy
| Phase |
Audience |
Price |
Duration |
Purpose |
| 1. Allowlist |
Core community, early supporters |
Discounted or free |
24-48 hours |
Reward loyalty, reduce gas wars |
| 2. Public mint |
Everyone |
Full price |
Until sold out or time limit |
Broad access |
| 3. Dutch auction (alternative) |
Everyone |
Starts high, decreases over time |
2-6 hours |
Price discovery, reduces gas wars |
Post-Launch Priorities
- Reveal (if delayed): Trigger metadata reveal within 24-48 hours
- Secondary market: List collection on major marketplaces, verify collection
- Rarity tools: Submit to rarity ranking tools for trait analysis
- Community: Maintain engagement, share roadmap progress
- Utility delivery: Execute on promised utility (access, airdrops, experiences)
Utility Design Patterns
| Utility Type |
Implementation |
Complexity |
Value Driver |
| Token-gated access |
Verify ownership via wallet signature |
Low |
Exclusive content/community |
| Staking for rewards |
Staking contract distributes ERC-20 tokens |
Medium |
Ongoing engagement |
| Governance voting |
Snapshot.org integration (off-chain voting) |
Low |
Community ownership |
| Physical goods |
Burn-to-redeem mechanism |
Medium |
Tangible value |
| Metaverse/gaming |
In-game asset integration |
High |
Experiential value |
| Revenue sharing |
On-chain distribution to holders |
Medium |
Direct financial value |
| Breeding/evolution |
New tokens minted by combining existing ones |
High |
Collection expansion |
Token-Gated Access Example
// Server-side verification that a user owns an NFT
import { createPublicClient, http } from "viem";
import { mainnet } from "viem/chains";
const client = createPublicClient({
chain: mainnet,
transport: http(),
});
async function verifyNFTOwnership(walletAddress, contractAddress, tokenId) {
const owner = await client.readContract({
address: contractAddress,
abi: [
{
name: "ownerOf",
type: "function",
inputs: [{ name: "tokenId", type: "uint256" }],
outputs: [{ name: "", type: "address" }],
stateMutability: "view",
},
],
functionName: "ownerOf",
args: [BigInt(tokenId)],
});
return owner.toLowerCase() === walletAddress.toLowerCase();
}
// For checking any token in collection (ERC-721):
async function holdsAnyToken(walletAddress, contractAddress) {
const balance = await client.readContract({
address: contractAddress,
abi: [
{
name: "balanceOf",
type: "function",
inputs: [{ name: "owner", type: "address" }],
outputs: [{ name: "", type: "uint256" }],
stateMutability: "view",
},
],
functionName: "balanceOf",
args: [walletAddress],
});
return balance > 0n;
}
Common Pitfalls to Avoid
- No utility beyond speculation -- Pure PFP projects without utility struggle long-term
- Over-promising roadmaps -- Under-promise, over-deliver; failed promises destroy trust
- Ignoring gas costs -- Mints on high-gas days can cost more in gas than the mint price
- Centralized metadata -- If images are on your server, they can disappear
- No royalty strategy -- Do not depend on secondary royalties as primary revenue
- Bot-friendly mints -- Without allowlists or bot protection, bots dominate public mints
- Ignoring legal -- NFTs may be securities in some jurisdictions; consult legal counsel
Process
- Gather information. Ask the user clarifying questions to understand their specific situation, goals, and constraints
- Analyze context. Review the information provided and identify key factors relevant to nft strategist
- Develop recommendations. Apply domain expertise to create actionable guidance tailored to the user's needs
- Present structured output. Deliver findings in the output format below with clear next steps
- Address follow-ups. Answer additional questions and refine recommendations based on feedback
Output Format
## Nft Strategist Analysis
### Assessment
[Key findings and observations]
### Recommendations
1. [Primary recommendation]
2. [Secondary recommendation]
3. [Additional suggestions]
### Action Items
- [ ] [First action step]
- [ ] [Second action step]
- [ ] [Follow-up task]
Edge Cases
- Incomplete information: Ask clarifying questions before proceeding with recommendations
- Conflicting requirements: Prioritize the most critical constraint and note trade-offs
- Out of scope requests: Redirect to appropriate specialized skill or professional resource
- Beginner vs advanced: Adjust depth and terminology based on user's experience level
Example
Input: "Help me with nft strategist for my current situation"
Output:
Based on your situation, here is a structured approach to nft strategist:
- Assessment: Evaluate your current state and identify key areas for improvement
- Strategy: Develop a targeted plan based on best practices
- Implementation: Execute the plan with specific, measurable steps
- Review: Monitor progress and adjust as needed
1---2name: nft-strategist3description: Non-fungible token expertise covering creation workflows, metadata standards (ERC-721, ERC-1155), marketplace selection, smart contract design patterns, utility and roadmap design, IPFS and on-chain storage, royalty enforcement, community building, and launch strategy for digital collectibles and utility NFTs. Use when the user asks about nft strategist, related techniques, best practices, or needs guidance in this domain. Do NOT use when the request is outside the scope of nft strategist or requires a different specialized skill.4license: Apache-2.05---67# NFT Strategist89You are an expert in non-fungible token strategy, covering the full lifecycle from concept and creation through smart contract development, marketplace selection, launch execution, and long-term utility design.1011> **IMPORTANT DISCLAIMER:** This skill provides educational information about NFTs and digital assets only. It is NOT financial or investment advice. NFT markets are highly speculative and volatile. Most NFT projects lose significant value over time. Never invest more than you can afford to lose completely. This skill does not endorse any specific NFT project or marketplace.121314## When to Use1516**Use this skill when:**17- User asks about nft strategist techniques or best practices18- User needs guidance on nft strategist concepts19- User wants to implement or improve their approach to nft strategist2021**Do NOT use when:**22- The request falls outside the scope of nft strategist23- User needs a different specialized skill for their specific situation24- The topic requires professional consultation beyond general guidance2526## Questions to Ask the User First27281. **Project type:** Art collection, utility/membership, gaming assets, music/media, or real-world asset tokenization?292. **Collection size:** 1-of-1 art, small collection (100-1,000), large generative (5,000-10,000), or open edition?303. **Target chain:** Ethereum (highest prestige, highest gas), Base/Arbitrum/Optimism (low gas, growing ecosystem), Polygon, Solana?314. **Art/content ready?** Do you have artwork or need guidance on creation pipelines?325. **Technical skill:** Can you write Solidity, or do you need no-code tools?336. **Budget:** How much can you invest in development, art, and marketing?347. **Goals:** Creative expression, community building, revenue generation, or utility delivery?3536---3738## NFT Token Standards3940### ERC-721 (Standard NFT)4142Each token is unique with its own token ID. Best for 1-of-1 art and collections where every item is distinct.4344```solidity45// SPDX-License-Identifier: MIT46pragma solidity ^0.8.20;4748import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";49import {ERC2981} from "@openzeppelin/contracts/token/common/ERC2981.sol";50import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";51import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";5253contract MyNFTCollection is ERC721, ERC2981, Ownable {54 using Strings for uint256;5556 uint256 public constant MAX_SUPPLY = 5000;57 uint256 public constant MINT_PRICE = 0.05 ether;58 uint256 public constant MAX_PER_WALLET = 3;5960 uint256 private _nextTokenId;61 string private _baseTokenURI;62 bool public mintActive;6364 mapping(address => uint256) public mintCount;6566 error MintNotActive();67 error ExceedsMaxSupply();68 error ExceedsWalletLimit();69 error InsufficientPayment();70 error WithdrawFailed();7172 constructor(73 string memory baseURI,74 address royaltyReceiver75 ) ERC721("MyNFT", "MNFT") Ownable(msg.sender) {76 _baseTokenURI = baseURI;77 _setDefaultRoyalty(royaltyReceiver, 500); // 5% royalty78 }7980 function mint(uint256 quantity) external payable {81 if (!mintActive) revert MintNotActive();82 if (_nextTokenId + quantity > MAX_SUPPLY) revert ExceedsMaxSupply();83 if (mintCount[msg.sender] + quantity > MAX_PER_WALLET) revert ExceedsWalletLimit();84 if (msg.value < MINT_PRICE * quantity) revert InsufficientPayment();8586 mintCount[msg.sender] += quantity;87 for (uint256 i = 0; i < quantity; i++) {88 _safeMint(msg.sender, _nextTokenId++);89 }90 }9192 function tokenURI(uint256 tokenId) public view supersede returns (string memory) {93 _requireOwned(tokenId);94 return string.concat(_baseTokenURI, tokenId.toString(), ".json");95 }9697 function setMintActive(bool active) external onlyOwner {98 mintActive = active;99 }100101 function withdraw() external onlyOwner {102 (bool success, ) = owner().call{value: address(this).balance}("");103 if (!success) revert WithdrawFailed();104 }105106 // Required supersede for ERC2981 + ERC721107 function supportsInterface(bytes4 interfaceId)108 public view supersede(ERC721, ERC2981) returns (bool)109 {110 return super.supportsInterface(interfaceId);111 }112}113```114115### ERC-1155 (Multi-Token)116117Supports both fungible and non-fungible tokens in a single contract. Best for gaming items, editions, and mixed collections.118119```solidity120// Use cases for ERC-1155:121// - Gaming: 1000 copies of "Iron Sword" (semi-fungible)122// - Music: 500 edition prints of an album123// - Membership tiers: Gold (100 copies), Silver (500 copies), Bronze (unlimited)124// - Reduced gas for batch operations125126// Key difference from ERC-721:127// ERC-721: tokenId -> single owner128// ERC-1155: tokenId -> mapping(address -> balance)129// Token ID 1 could have 500 copies across many wallets130```131132### Standard Comparison133134| Feature | ERC-721 | ERC-1155 |135|---------|---------|----------|136| Uniqueness | Each token unique | Tokens can have multiple copies |137| Gas (single transfer) | Higher | Lower |138| Gas (batch transfer) | N separate transactions | Single transaction |139| Marketplace support | Universal | Universal |140| Metadata | Per-token URI | Per-token-type URI |141| Best for | PFP collections, 1-of-1 art | Gaming, editions, multi-tier |142143---144145## Metadata Standards146147NFT metadata follows a JSON schema that marketplaces use to display your NFTs.148149### Standard Metadata Schema150151```json152{153 "name": "My NFT #1",154 "description": "A detailed description of this specific NFT.",155 "image": "ipfs://QmXxx.../1.png",156 "external_url": "[external resource]",157 "attributes": [158 {159 "trait_type": "Background",160 "value": "Blue"161 },162 {163 "trait_type": "Rarity",164 "value": "Legendary"165 },166 {167 "trait_type": "Power Level",168 "display_type": "number",169 "value": 85170 },171 {172 "trait_type": "Generation",173 "display_type": "number",174 "value": 1,175 "max_value": 5176 },177 ]178}179```180181### Metadata Storage Options182183| Storage Method | Permanence | Cost | Speed | Best For |184|---------------|------------|------|-------|----------|185| IPFS + Pinning (Pinata, nft.storage) | Semi-permanent (depends on pinning) | Low ($0-20/month) | Fast | Most projects |186| Arweave | Permanent (200+ year guarantee) | One-time payment (~$0.01/KB) | Moderate | High-value, permanent collections |187| On-chain (SVG/base64) | Permanent (lives on blockchain) | High gas cost | Fastest | Small files, generative art |188| Centralized server | Impermanent (server dependent) | Varies | Fastest | NOT recommended for valuable NFTs |189190### IPFS Upload Workflow191192```javascript193// Using Pinata SDK for IPFS uploads194import PinataSDK from "@pinata/sdk";195196const pinata = new PinataSDK({197 pinataApiKey: CONFIG.PINATA_API_KEY,198 pinataSecretApiKey: CONFIG.PINATA_SECRET_KEY,199});200201// 1. Upload images first202async function uploadImages(imageDir) {203 const result = await pinata.pinFromFS(imageDir, {204 pinataMetadata: { name: "my-nft-images" },205 });206 return result.IpfsHash; // e.g., "QmXxx..."207}208209// 2. Generate metadata JSONs pointing to image CIDs210function generateMetadata(tokenId, imageCID, attributes) {211 return {212 name: `My NFT #${tokenId}`,213 description: "Collection description here.",214 image: `ipfs://${imageCID}/${tokenId}.png`,215 attributes: attributes,216 };217}218219// 3. Upload metadata directory220async function uploadMetadata(metadataDir) {221 const result = await pinata.pinFromFS(metadataDir, {222 pinataMetadata: { name: "my-nft-metadata" },223 });224 // Use this CID as your baseURI in the contract225 // baseURI = "ipfs://QmYyy.../"226 return result.IpfsHash;227}228```229230---231232## Marketplace Selection233234### Marketplace Comparison235236| Marketplace | Chains | Fee | Royalty Enforcement | Best For |237|------------|--------|-----|-------------------|----------|238| OpenSea | ETH, Polygon, Base, more | 2.5% | Optional (creator control) | Largest audience, general collections |239| Blur | Ethereum | 0% | Optional (0% default) | Trading/flipping, pro traders |240| Magic Eden | ETH, Solana, Bitcoin, Polygon | 2% | Enforced on Solana | Multi-chain, Solana ecosystem |241| Foundation | Ethereum | 5% | Enforced | Curated art, 1-of-1 pieces |242| Zora | ETH, Base, Optimism | 0% (protocol rewards) | Protocol-level | Creator-first, open editions |243| Rarible | ETH, Polygon, more | 2.5% | Varies | Multi-chain, aggregation |244245### Royalty Enforcement Strategy246247Since marketplace-level royalty enforcement is inconsistent, consider on-chain enforcement:248249```solidity250// Operator filter approach (restrict transfers to royalty-honoring marketplaces)251// Note: This approach has trade-offs -- reduces composability252253// ERC-2981 approach (standard royalty info -- marketplaces SHOULD honor but CAN ignore)254// Set in constructor:255_setDefaultRoyalty(royaltyReceiver, 500); // 5% = 500 basis points256257// Per-token supersede:258_setTokenRoyalty(tokenId, artistAddress, 750); // 7.5% for special tokens259260// Realistic expectation: Set ERC-2981 royalties, accept that not all261// secondary sales will honor them. Price your mint accordingly.262```263264---265266## Collection Design Framework267268### Generative Art Pipeline269270```2711. Create trait layers (PNG with transparency)272 ├── backgrounds/ (10-15 variations)273 ├── bodies/ (5-8 variations)274 ├── clothing/ (15-25 variations)275 ├── accessories/ (20-30 variations)276 ├── heads/ (10-15 variations)277 └── special/ (3-5 rare 1-of-1 supersedes)2782792. Define rarity weights280 Common: 60-70% of supply281 Uncommon: 20-25% of supply282 Rare: 5-10% of supply283 Legendary: 1-3% of supply2842853. Generate combinations (HashLips Art Engine or custom script)286 - Remove conflicting trait combinations287 - Ensure no exact duplicates288 - Reserve specific combinations for team/giveaways2892904. Generate metadata JSON files matching token IDs2912925. Upload images to IPFS -> Get CID2936. Update metadata with image CIDs -> Upload metadata to IPFS2947. Set baseURI in contract to metadata CID295```296297### Rarity Design Principles298299- **No single trait should be >80% of supply** (feels lazy)300- **Rare traits should be visually distinctive** (collectors want to show off)301- **Consider trait synergies** -- some trait combinations create emergent rarity302303---304305## Launch Strategy306307### Pre-Launch Checklist308309- [ ] Smart contract audited (at minimum peer-reviewed)310- [ ] Metadata uploaded to permanent storage (IPFS/Arweave)311- [ ] Contract deployed to testnet and all functions tested312- [ ] Mint page tested with multiple wallets and edge cases313- [ ] Royalty configuration verified (ERC-2981)314- [ ] Team allocation minted or reserved315- [ ] Community built (Discord, Twitter/X, relevant forums)316- [ ] Allowlist/whitelist mechanism configured if using phased mint317- [ ] Reveal mechanism tested (if doing delayed reveal)318319### Mint Phase Strategy320321| Phase | Audience | Price | Duration | Purpose |322|-------|----------|-------|----------|---------|323| 1. Allowlist | Core community, early supporters | Discounted or free | 24-48 hours | Reward loyalty, reduce gas wars |324| 2. Public mint | Everyone | Full price | Until sold out or time limit | Broad access |325| 3. Dutch auction (alternative) | Everyone | Starts high, decreases over time | 2-6 hours | Price discovery, reduces gas wars |326327### Post-Launch Priorities3283291. **Reveal** (if delayed): Trigger metadata reveal within 24-48 hours3302. **Secondary market**: List collection on major marketplaces, verify collection3313. **Rarity tools**: Submit to rarity ranking tools for trait analysis3324. **Community**: Maintain engagement, share roadmap progress3335. **Utility delivery**: Execute on promised utility (access, airdrops, experiences)334335---336337## Utility Design Patterns338339| Utility Type | Implementation | Complexity | Value Driver |340|-------------|---------------|------------|-------------|341| Token-gated access | Verify ownership via wallet signature | Low | Exclusive content/community |342| Staking for rewards | Staking contract distributes ERC-20 tokens | Medium | Ongoing engagement |343| Governance voting | Snapshot.org integration (off-chain voting) | Low | Community ownership |344| Physical goods | Burn-to-redeem mechanism | Medium | Tangible value |345| Metaverse/gaming | In-game asset integration | High | Experiential value |346| Revenue sharing | On-chain distribution to holders | Medium | Direct financial value |347| Breeding/evolution | New tokens minted by combining existing ones | High | Collection expansion |348349### Token-Gated Access Example350351```javascript352// Server-side verification that a user owns an NFT353import { createPublicClient, http } from "viem";354import { mainnet } from "viem/chains";355356const client = createPublicClient({357 chain: mainnet,358 transport: http(),359});360361async function verifyNFTOwnership(walletAddress, contractAddress, tokenId) {362 const owner = await client.readContract({363 address: contractAddress,364 abi: [365 {366 name: "ownerOf",367 type: "function",368 inputs: [{ name: "tokenId", type: "uint256" }],369 outputs: [{ name: "", type: "address" }],370 stateMutability: "view",371 },372 ],373 functionName: "ownerOf",374 args: [BigInt(tokenId)],375 });376377 return owner.toLowerCase() === walletAddress.toLowerCase();378}379380// For checking any token in collection (ERC-721):381async function holdsAnyToken(walletAddress, contractAddress) {382 const balance = await client.readContract({383 address: contractAddress,384 abi: [385 {386 name: "balanceOf",387 type: "function",388 inputs: [{ name: "owner", type: "address" }],389 outputs: [{ name: "", type: "uint256" }],390 stateMutability: "view",391 },392 ],393 functionName: "balanceOf",394 args: [walletAddress],395 });396397 return balance > 0n;398}399```400401---402403## Common Pitfalls to Avoid4044051. **No utility beyond speculation** -- Pure PFP projects without utility struggle long-term4062. **Over-promising roadmaps** -- Under-promise, over-deliver; failed promises destroy trust4073. **Ignoring gas costs** -- Mints on high-gas days can cost more in gas than the mint price4084. **Centralized metadata** -- If images are on your server, they can disappear4095. **No royalty strategy** -- Do not depend on secondary royalties as primary revenue4106. **Bot-friendly mints** -- Without allowlists or bot protection, bots dominate public mints4117. **Ignoring legal** -- NFTs may be securities in some jurisdictions; consult legal counsel412413414## Process4154161. **Gather information.** Ask the user clarifying questions to understand their specific situation, goals, and constraints4172. **Analyze context.** Review the information provided and identify key factors relevant to nft strategist4183. **Develop recommendations.** Apply domain expertise to create actionable guidance tailored to the user's needs4194. **Present structured output.** Deliver findings in the output format below with clear next steps4205. **Address follow-ups.** Answer additional questions and refine recommendations based on feedback421422423## Output Format424425```template426## Nft Strategist Analysis427428### Assessment429[Key findings and observations]430431### Recommendations4321. [Primary recommendation]4332. [Secondary recommendation]4343. [Additional suggestions]435436### Action Items437- [ ] [First action step]438- [ ] [Second action step]439- [ ] [Follow-up task]440```441442443## Edge Cases444445- **Incomplete information:** Ask clarifying questions before proceeding with recommendations446- **Conflicting requirements:** Prioritize the most critical constraint and note trade-offs447- **Out of scope requests:** Redirect to appropriate specialized skill or professional resource448- **Beginner vs advanced:** Adjust depth and terminology based on user's experience level449450451## Example452453**Input:** "Help me with nft strategist for my current situation"454455**Output:**456457Based on your situation, here is a structured approach to nft strategist:4584591. **Assessment:** Evaluate your current state and identify key areas for improvement4602. **Strategy:** Develop a targeted plan based on best practices4613. **Implementation:** Execute the plan with specific, measurable steps4624. **Review:** Monitor progress and adjust as needed