mcpField
N
nft-development

nft-development

github.com/pluginagentmarketplace開発144 回インストール42 週間前に更新
リポジトリ

nft-development について

トークン規格、メタデータ、マーケットプレイス連携、オンチェーン生成アートを扱う NFT 開発ガイドの技能です。NFT コントラクトやコレクションを設計・構築する開発者を対象としています。

主な機能

  1. 01ERC-721、ERC-721A、ERC-1155、DN404 の比較
  2. 02NFT メタデータの設計
  3. 03OpenSea とロイヤリティの解説
  4. 04オンチェーン SVG アートの生成
  5. 05ガス最適化と注意点の説明

活用シーン

  1. 01コレクションに使うトークン規格の選定
  2. 02NFT メタデータの構成
  3. 03コントラクトへのロイヤリティ追加
  4. 04メタデータやミントの問題の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/pluginagentmarketplace/custom-plugin-blockchain --skill nft-development

インストール後、Claude Code で/nft-developmentを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
config.yaml
schema.json
references/
GUIDE.md
PATTERNS.md
scripts/
validate.py

詳細

NFT 開発スキル

トークン規格、メタデータ設計、マーケットプレイス連携、オンチェーンのジェネレーティブアートを活用した NFT 開発を習得します。

クイックスタート

# Invoke this skill for NFT development
Skill("nft-development", topic="standards", standard="ERC721A")

対象トピック

1. トークン規格

適切な規格を選択します。

  • ERC-721:標準的な NFT。ID ごとに 1 つのトークン
  • ERC-721A:ガスを最適化したバッチミント
  • ERC-1155:マルチトークン、セミファンジブル
  • DN404:分割可能な NFT ハイブリッド
2. メタデータ設計

NFT データを構成します。

  • オンチェーン:Base64 JSON、SVG
  • IPFS:コンテンツアドレス指定型ストレージ
  • Arweave:永続ストレージ
  • 動的:進化するトレイト
3. マーケットプレイス連携

NFT を出品・販売します。

  • OpenSea:Seaport プロトコル
  • ロイヤリティ:EIP-2981
  • オペレーターフィルター:ロイヤリティの強制
  • コレクション認証:メタデータ規格
4. オンチェーンアート

Solidity でアートを生成します。

  • SVG 生成:動的な図形
  • シードベース:決定論的なランダム性
  • トレイト:希少性の分布
  • Base64:データ URI エンコード

コード例

ERC-721A ミント
// 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;
    }
}
オンチェーン SVG
function tokenURI(uint256 tokenId) public view returns (string memory) {
    uint256 seed = seeds[tokenId];

    string memory svg = string(abi.encodePacked(
        '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400">',
        '<rect width="400" height="400" fill="#', _getColor(seed), '"/>',
        '<circle cx="200" cy="200" r="80" fill="#', _getColor(seed >> 24), '"/>',
        '</svg>'
    ));

    string memory json = string(abi.encodePacked(
        '{"name":"Art #', tokenId.toString(),
        '","image":"data:image/svg+xml;base64,', Base64.encode(bytes(svg)), '"}'
    ));

    return string(abi.encodePacked(
        "data:application/json;base64,",
        Base64.encode(bytes(json))
    ));
}
EIP-2981 ロイヤリティ
import "@openzeppelin/contracts/token/common/ERC2981.sol";

contract NFTWithRoyalty is ERC721A, ERC2981 {
    constructor() {
        _setDefaultRoyalty(msg.sender, 500); // 5%
    }

    function supportsInterface(bytes4 interfaceId)
        public view override(ERC721A, ERC2981)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

メタデータスキーマ

ERC-721 規格
{
  "name": "Cool NFT #1",
  "description": "A very cool NFT",
  "image": "ipfs://QmXxx.../1.png",
  "animation_url": "ipfs://QmXxx.../1.mp4",
  "external_url": "https://example.com/1",
  "attributes": [
    { "trait_type": "Background", "value": "Blue" },
    { "trait_type": "Rarity", "value": "Legendary" },
    { "display_type": "number", "trait_type": "Power", "value": 100 }
  ]
}

規格の比較

規格最適な用途ガス(1 ミント)ガス(5 ミント)
ERC-721シンプルな NFT~100k~500k
ERC-721APFP コレクション~100k~120k
ERC-1155ゲームアイテム~50k~80k

よくある落とし穴

落とし穴問題解決策
メタデータが表示されないtokenURI の不備JSON を検証し、CORS を確認する
ガス代が高すぎる標準の ERC-721バッチには ERC-721A を使用する
ロイヤリティが支払われないマーケットプレイスが無視するオペレーターフィルターを使用する
リビールが機能しないベース URI の誤りまずテストネットでテストする

トラブルシューティング

「OpenSea でメタデータが表示されない」
  1. tokenURI が有効な JSON を返すことを確認します
  2. IPFS ゲートウェイにアクセスできることを確認します
  3. API 経由でメタデータを更新します。
curl "https://api.opensea.io/api/v2/chain/ethereum/contract/{addr}/nfts/{id}/refresh"
「バッチミントでガス不足になる」
  • ERC-721 の代わりに ERC-721A を使用します
  • 1 回のトランザクションあたりのバッチサイズを 10~20 に制限します
「ロイヤリティが強制されない」

オペレーターフィルターを実装します。

import "operator-filter-registry/src/DefaultOperatorFilterer.sol";

function setApprovalForAll(address op, bool approved)
    public override onlyAllowedOperatorApproval(op)
{
    super.setApprovalForAll(op, approved);
}

ガスの最適化

手法節約量
ERC721A のバッチ処理バッチで約 80%
Merkle ホワイトリストマッピングと比べて約 50%
パックドストレージスロットあたり約 20k
カスタムエラーエラーあたり約 200

相互参照

  • Bonded Agent:07-nft-development
  • 関連スキル:solidity-development、web3-frontend

リソース

  • ERC-721:eips.ethereum.org/EIPS/eip-721
  • ERC-721A:erc721a.org
  • OpenSea メタデータ:docs.opensea.io/docs/metadata-standards

バージョン履歴

バージョン日付変更内容
2.0.02025-01規格とオンチェーン機能を備えた本番品質のリリース
1.0.02024-12初回リリース

コメント