solidity-nft
npx skills add https://github.com/stanah/dotagents --skill solidity-nft
Agent 安装分布
Skill 文档
solidity-nft: NFT éçºã¹ãã«
NFT éçºã«ããã ãã¼ã¯ã³æ¨æºé¸æããã¼ã±ãããã¬ã¤ã¹è¨è¨ãã¡ã¿ãã¼ã¿æ¦ç¥ãæä¾ãããã¡ã¤ã³ç¹åã¹ãã«ã
対象
- ERC721 / ERC1155 / ERC6551ï¼Token Bound Accountsï¼
- NFT ãã¼ã±ãããã¬ã¤ã¹ï¼ãªã¼ãã¼ããã¯ã»ãªã¼ã¯ã·ã§ã³ï¼
- ã¡ã¿ãã¼ã¿ç®¡çï¼ãªã³ãã§ã¼ã³ã»IPFSã»åç NFTï¼
- ãã¤ã¤ãªãã£ï¼EIP-2981ï¼
ã¯ã¼ã¯ããã¼
Step 1: è¦ä»¶ã«å¿ãããªãã¡ã¬ã³ã¹é¸æ
ã¦ã¼ã¶ã¼ã®è¦ä»¶ãã NFT ã®å¯¾è±¡ãã¡ã¤ã³ãå¤å®ãã:
| ã¦ã¼ã¹ã±ã¼ã¹ | ãªãã¡ã¬ã³ã¹ | èªã¿è¾¼ã¿æã®æ³¨ç®ãã¤ã³ã |
|---|---|---|
| ãã¼ã¯ã³çºè¡ã»ãã³ã | references/token-standards.md |
ERC721 vs ERC1155 ã®é¸æåºæºãERC721A ã®ã¬ã¹æé©åãERC6551 ã® TBA ãã¿ã¼ã³ |
| ãã¼ã±ãããã¬ã¤ã¹æ§ç¯ | references/marketplace-patterns.md |
ãªã¼ãã¼ãã㯠vs ãªã¼ã¯ã·ã§ã³ãã¨ã¹ã¯ãã¼ããã¤ã¤ãªãã£å¾´å |
| ã¡ã¿ãã¼ã¿è¨è¨ | references/metadata-patterns.md |
ãªã³ãã§ã¼ã³ vs IPFS vs åç NFTãOpenSea äºæã¡ã¿ãã¼ã¿ã¹ãã¼ã |
è¤æ°ãã¡ã¤ã³ãé¢é£ããå ´åï¼ä¾: ãã³ã + ã¡ã¿ãã¼ã¿ï¼ã¯å ¨ã¦ã®è©²å½ãªãã¡ã¬ã³ã¹ãèªã¿è¾¼ãã
æ¤è¨¼ã²ã¼ã: å°ãªãã¨ã 1 ã¤ã®ãã¡ã¤ã³ãç¹å®ã§ãããã¨ãè¦ä»¶ãä¸æç¢ºãªå ´å㯠AskUserQuestion ã§ç¢ºèªããã
Step 2: ãã¼ã¯ã³æ¨æºã®æ±ºå®
è¦ä»¶ã«åºã¥ããã¼ã¯ã³æ¨æºã鏿ãã:
| è¦ä»¶ | æ¨å¥¨æ¨æº | çç± |
|---|---|---|
| 1:1 ã®ã¦ãã¼ã¯ã¢ã¤ãã | ERC721 | æãåºããµãã¼ãããããOpenSea / ãã¼ã±ãããã¬ã¤ã¹äºææ§ãé«ã |
| 大éãã³ãï¼1000+ï¼ | ERC721A | ERC721 äºæãããããã³ãã§ã¬ã¹ 60-70% 忏 |
| åä¸ã¢ã¤ãã ã®è¤æ°çºè¡ | ERC1155 | FT 㨠NFT ãåä¸ã³ã³ãã©ã¯ãã§ç®¡çãã²ã¼ã ã¢ã¤ãã ã«æé© |
| ã²ã¼ã ã¢ã¤ãã ï¼è¤æ°ç¨®é¡ï¼ | ERC1155 | balanceOf(account, tokenId) ã§ç¨®é¡å¥ã®ä¿ææ°ãå¹ççã«ç®¡ç |
| NFT ã«ã¦ã©ã¬ããæ©è½ãæãããã | ERC6551 | NFT èªä½ãã¹ãã¼ãã¢ã«ã¦ã³ããæã¡ãè³ç£ã®ä¿æã»ãã©ã³ã¶ã¯ã·ã§ã³å®è¡ãå¯è½ |
夿ãé£ããå ´å: AskUserQuestion ã§ãã¢ã¤ãã ã®ç¨®é¡æ°ããåä¸ã¢ã¤ãã ã®çºè¡æ°ããã¬ã¹ã³ã¹ãéè¦ãæ©è½éè¦ããã確èªããã
æ¤è¨¼ã²ã¼ã: ãã¼ã¯ã³æ¨æºã決å®ãã対å¿ãã OpenZeppelin / Solady / ERC721A ã©ã¤ãã©ãªãå©ç¨å¯è½ã§ãããã¨ã
Step 3: ã³ã¼ãçæã»ã¬ãã¥ã¼
solidity-coreã®language-patterns.mdã«å¾ã NatSpecã»ã³ã¼ãã£ã³ã°è¦ç´ãé©ç¨ããã- NFT åºæã®èæ
®äºé
ãçµã¿è¾¼ã:
- ãã³ã颿°ã«ã¯å¿
ãã¢ã¯ã»ã¹å¶å¾¡ï¼
onlyOwner/ Merkle proof / ç½²åæ¤è¨¼ï¼ MAX_SUPPLYä¸éã®è¨å®- ã¡ã¿ãã¼ã¿ URI ã®è¨è¨ï¼
baseURI+tokenIdãã¾ãã¯åå¥ URIï¼ - ãã¤ã¤ãªãã£: EIP-2981 ã®
royaltyInfoå®è£
- ãã³ã颿°ã«ã¯å¿
ãã¢ã¯ã»ã¹å¶å¾¡ï¼
- ãã¹ãã³ã¼ããåæã«çæãã:
- ãã³ãï¼æåã»ä¸éè¶ éã»æ¨©éä¸è¶³ï¼
- transferã»approve
- ã¡ã¿ãã¼ã¿ URI ã®æ£å½æ§
- ãã¤ã¤ãªãã£è¨ç®ã®æ£ç¢ºæ§
æ¤è¨¼ã²ã¼ã: forge build ãã¨ã©ã¼ãªãå®äºãããã¨ãforge test ã§å
¨ãã¹ãããã¹ãããã¨ã
Step 4: ã¡ã¿ãã¼ã¿ã»ãã¼ã±ãããã¬ã¤ã¹ç¢ºèª
- ã¡ã¿ãã¼ã¿: OpenSea / ãã¼ã±ãããã¬ã¤ã¹ã®æ¨æºã«æºæ ãã¦ããã:
name,description,imageãã£ã¼ã«ããåå¨ãããattributesã trait 表示ã«å¯¾å¿ãã¦ãããtokenURIãæå¹ãª JSON ãè¿ãã
- ãã¤ã¤ãªãã£: EIP-2981 ã®
royaltyInfoãæ£ããã¢ãã¬ã¹ã¨éé¡ãè¿ãã - åæ:
ERC721Enumerableãå¿ è¦ãªå ´åã¯ã¬ã¹ã³ã¹ãã®ãã¬ã¼ããªããçè§£ããä¸ã§å°å ¥ãã¦ããã
æ¤è¨¼ã²ã¼ã: tokenURI ãæå¹ãª JSON ãè¿ããOpenSea ã¡ã¿ãã¼ã¿æ¨æºã«æºæ ãã¦ãããã¨ã
使ç¨ä¾
ä¾ 1: ã¸ã§ãã©ãã£ã NFT ã³ã¬ã¯ã·ã§ã³
ã¦ã¼ã¶ã¼å ¥å: ã10,000 ä½ã® NFT ã³ã¬ã¯ã·ã§ã³ãä½ãããããã¯ã¤ããªã¹ãä»ãã§ãã³ããããã
ã¢ã¯ã·ã§ã³:
- Step 1: ãã¼ã¯ã³çºè¡ + ã¡ã¿ãã¼ã¿ â
token-standards.md+metadata-patterns.mdãèªã¿è¾¼ã¿ - Step 2: 大éãã³ã â ERC721A ã鏿ï¼ããããã³ãã§ã¬ã¹åæ¸ï¼
- Step 3: 以ä¸ãçæ:
src/GenesisNFT.solâ ERC721A ç¶æ¿ãMerkle proof ã«ãããã¯ã¤ããªã¹ãæ¤è¨¼ãMAX_SUPPLY = 10_000ãreveal æ©è½ï¼åæã¯ placeholder URI â å¾ã§ baseURI ãæ´æ°ï¼src/libraries/MerkleVerifier.solâ Merkle proof æ¤è¨¼ãã«ãã¼test/GenesisNFT.t.solâ ãã¯ã¤ããªã¹ãæ¤è¨¼ããã³ãä¸éãreveal åå¾ã® URI ãã¹ãscript/GenerateMerkleRoot.s.solâ ãã¯ã¤ããªã¹ãããã® Merkle root çæã¹ã¯ãªãã
- Step 4: ã¡ã¿ãã¼ã¿ã OpenSea æ¨æºã«æºæ ãã¦ããã確èªããã¤ã¤ãªãã£è¨å®ï¼5% ãæ¨å¥¨ï¼
çµæ: Merkle proof ãã¯ã¤ããªã¹ãä»ãã® ERC721A ã³ã¬ã¯ã·ã§ã³ããã¹ãã»ã¹ã¯ãªããä»ãã§çæãããã
ä¾ 2: åç NFTï¼ã²ã¼ã å ã¬ãã«ã¢ããï¼
ã¦ã¼ã¶ã¼å ¥å: ãNFT ã®ã¬ãã«ãä¸ããã¨ã¡ã¿ãã¼ã¿ãå¤ããããã«ãããã
ã¢ã¯ã·ã§ã³:
- Step 1: ã¡ã¿ãã¼ã¿è¨è¨ â
metadata-patterns.mdãèªã¿è¾¼ã¿ â åç NFT ãã¿ã¼ã³ã鏿 - Step 2: 1:1 ã¦ãã¼ã¯ â ERC721 ã鏿
- Step 3: 以ä¸ãçæ:
src/DynamicNFT.solâ ERC721URIStorage ç¶æ¿ãlevelmappingãlevelUp颿°ãtokenURIããªã³ãã§ã¼ã³ã§åççæï¼Base64 ã¨ã³ã³ã¼ã JSON + SVGï¼test/DynamicNFT.t.solâ ã¬ãã«ã¢ããåå¾ã® tokenURI å¤åãã¹ããæ¨©éãã§ãã¯
- Step 4:
tokenURIãã¬ãã«ã«å¿ãã¦æ£ãã JSON ãè¿ãã確èª
çµæ: ã¬ãã«ã«å¿ãã¦ã¡ã¿ãã¼ã¿ãèªåæ´æ°ããããªã³ãã§ã¼ã³ NFT ãçæãããã
ä¾ 3: ERC1155 ã²ã¼ã ã¢ã¤ãã
ã¦ã¼ã¶ã¼å ¥å: ãã²ã¼ã ã®ã¢ã¤ãã ï¼å£ã»ç¾ã»ãã¼ã·ã§ã³ï¼ã NFT ã¨ãã¦çºè¡ãããããã¼ã·ã§ã³ã¯æ¶è²»å¯è½ã«ãã¦ã
ã¢ã¯ã·ã§ã³:
- Step 1: è¤æ°ç¨®é¡ + æ¶è²» â
token-standards.mdã® ERC1155 ã»ã¯ã·ã§ã³ãèªã¿è¾¼ã¿ - Step 2: è¤æ°ç¨®é¡ã®ã¢ã¤ãã â ERC1155 ã鏿
- Step 3: 以ä¸ãçæ:
src/GameItems.solâ ERC1155 ç¶æ¿ãã¢ã¤ãã ID 宿°ï¼SWORD = 0,SHIELD = 1,POTION = 2ï¼ãmint/mintBatchãusePotion颿°ï¼burnã§æ¶è²»ï¼test/GameItems.t.solâ ãã³ããããã転éããã¼ã·ã§ã³æ¶è²»ãæ®é«ç¢ºèªãã¹ã
- Step 4:
uri颿°ãåã¢ã¤ãã ID ã«å¯¾ãã¦æ£ããã¡ã¿ãã¼ã¿ãè¿ãã確èª
çµæ: FTï¼ãã¼ã·ã§ã³ï¼æ¶è²»å¯è½ï¼ã¨ NFTï¼å£ã»ç¾ï¼ã¦ãã¼ã¯ï¼ãåä¸ã³ã³ãã©ã¯ãã§ç®¡çããã²ã¼ã ã¢ã¤ãã ãçæãããã
ãã©ãã«ã·ã¥ã¼ãã£ã³ã°
1. OpenSea ã§ã¡ã¿ãã¼ã¿ã表示ãããªã
çç¶: NFT ã OpenSea ã«è¡¨ç¤ºãããããç»åã»å±æ§ãåºãªã
åå ã¨å¯¾ç:
tokenURIãç¡å¹ãª JSON ãè¿ã:cast call <address> "tokenURI(uint256)" <tokenId>ã§è¿ãå¤ã確èªãããJSON ãæ£ããå½¢å¼ãæ¤è¨¼ããã- IPFS ã²ã¼ãã¦ã§ã¤ã®åé¡:
ipfs://ãã¬ãã£ãã¯ã¹ã使ç¨ãã¦ããã確èªãHTTPS ã²ã¼ãã¦ã§ã¤ URLï¼https://ipfs.io/ipfs/...ï¼ã§ãã¢ã¯ã»ã¹å¯è½ã«ããã - ã¡ã¿ãã¼ã¿ã®ãã£ãã·ã¥: OpenSea 㯠ã¡ã¿ãã¼ã¿ããã£ãã·ã¥ãããæ´æ°å¾ã¯ OpenSea API ã®
refresh_metadataãå¼ã³åºãã imageãã£ã¼ã«ãã® MIME ã¿ã¤ã: SVG ã®å ´åã¯data:image/svg+xml;base64,...å½¢å¼ã使ç¨ããã
2. 大éãã³ãæã®ã¬ã¹ã³ã¹ããé«ã
çç¶: 1ä»¶ãã³ããã¨ã« 100k+ gas ããã
åå ã¨å¯¾ç:
- ERC721 ã®
_safeMintã使ç¨: ERC721A ã«åãæ¿ãããã¨ã§ãããããã³ãæã®ã¬ã¹ã 60-70% 忏ã§ãããforge install chiru-labs/ERC721Aã§ã¤ã³ã¹ãã¼ã«ã ERC721Enumerableã®ä½¿ç¨: Enumerable ã¯è¿½å ã®ã¹ãã¬ã¼ã¸æ¸ãè¾¼ã¿ã§ã¬ã¹ãé«ããä¸è¦ãªå ´åã¯åé¤ãããtotalSupply㯠counter 夿°ã§ä»£æ¿å¯è½ã- ã¹ãã¬ã¼ã¸ã®æé©å:
uint256ã® tokenId ã«ã¦ã³ã¿ã¼ãuint96çã«ç¸®å°ããstruct å ã§ãããã³ã°ããã
3. ãã³ãã MaxSupplyReached ã§ãªãã¼ããã
çç¶: ã¾ã MAX_SUPPLY ã«éãã¦ããªãã®ã«ãªãã¼ããã
åå ã¨å¯¾ç:
- ã«ã¦ã³ã¿ã¼ã®ä¸ä¸è´:
_tokenIdCounterã 0 å§ã¾ãã 1 å§ã¾ããã確èªãããMAX_SUPPLY = 10_000ã§ 0 å§ã¾ãã®å ´åãæå¾ã® tokenId 㯠9999ã - ããããã³ãæã®ä¸éãã§ãã¯:
_tokenIdCounter + quantity > MAX_SUPPLYã§ã¯ãªã_tokenIdCounter + quantity <= MAX_SUPPLYã§å¤å®ãã¦ããã確èªããã
4. ãã¤ã¤ãªãã£ã ãã¼ã±ãããã¬ã¤ã¹ã§é©ç¨ãããªã
çç¶: EIP-2981 ãå®è£ ããããä¸é¨ã®ãã¼ã±ãããã¬ã¤ã¹ã§ãã¤ã¤ãªãã£ãå¾´åãããªã
åå ã¨å¯¾ç:
- EIP-2981 ã¯ä»»ææºæ : EIP-2981 ã¯ãªããã§ã¼ã³ã®ç §ä¼æ¨æºã§ããããªã³ãã§ã¼ã³ã§å¼·å¶ã¯ãããªãããã¼ã±ãããã¬ã¤ã¹ã EIP-2981 ããµãã¼ããã¦ããã確èªããã
- Operator Filterï¼éæ¨å¥¨ï¼: OpenSea ã® OperatorFilterRegistry 㯠2023 å¹´ã«éæ¨å¥¨åããããæ°è¦ããã¸ã§ã¯ãã§ã¯ EIP-2981 ã®ã¿å®è£ ããã
- ãã¤ã¤ãªãã£çã®ç¢ºèª:
royaltyInfo(tokenId, salePrice)ãæ£ããéé¡ãè¿ããcast callã§ç¢ºèªãããæ¨å¥¨ç㯠2.5-7.5%ã
5. ERC6551 Token Bound Account ã®ãããã¤ã失æãã
çç¶: NFT ã«ç´ã¥ãã¢ã«ã¦ã³ãã®ä½æã失æãã
åå ã¨å¯¾ç:
- Registry ã¢ãã¬ã¹ã®ç¢ºèª: ERC6551 Registry ã¯åãã§ã¼ã³ã«å ¬å¼ãããã¤ããã¦ãããæ£ããã¢ãã¬ã¹ã使ç¨ãã¦ããã確èªããã
- implementation ã¢ãã¬ã¹ã®ç¢ºèª:
createAccountã«æ¸¡ã implementation ã³ã³ãã©ã¯ããæ£ãããããã¤ããã¦ããã確èªããã - salt ã®è¡çª: åã NFT + salt ã§æ¢ã«ã¢ã«ã¦ã³ããåå¨ããå ´åã¯
account()ã§æ¢åã¢ãã¬ã¹ãåå¾ããã
注æäºé
- ãã³ã颿°ã«ã¯å¿
ãé©åãªã¢ã¯ã»ã¹å¶å¾¡ãè¨å®ããï¼public mint ã§ã
MAX_PER_TX/MAX_PER_WALLETã®å¶éãæ¨å¥¨ï¼ã - 大éãã³ãæã®ã¬ã¹ã³ã¹ããèæ ®ããï¼ERC721A çã®æé©åå®è£ ã®æ¤è¨ï¼ã
- ã¡ã¿ãã¼ã¿ã®æ°¸ç¶æ§ã確ä¿ããï¼IPFS pinning / Arweaveï¼ãCIDï¼Content Identifierï¼ã¯ä¸å¤ã§ãããããã¡ã¿ãã¼ã¿å¤æ´ã«ã¯æ°ãã CID ãå¿ è¦ã
- ãã¤ã¤ãªãã£ã¯ EIP-2981 ãå®è£ ãããã¼ã±ãããã¬ã¤ã¹ã§ã®å¼·å¶åã®éçãçè§£ããã
- åºç¤çãªãã¿ã¼ã³ï¼ã¢ã¯ã»ã¹å¶å¾¡ãã¬ã¹æé©åçï¼ã¯
solidity-coreãåç §ããã - ããã³ãã¨ã³ãçµ±åï¼ãã³ã UIãã®ã£ã©ãªã¼è¡¨ç¤ºï¼ã¯
web3-frontendãåç §ããã - OpenZeppelin ã³ã³ãã©ã¯ãã®å©ç¨ãæ¨å¥¨ããç¬èªå®è£ ã¯é¿ããã