Skip to content

Repository files navigation

MyNFT プロジェクト

OpenZeppelinとHardhatを使用したシンプルなERC721 NFTスマートコントラクトです。

概要

このプロジェクトには以下が含まれています:

  • MyNFT.sol: ERC721標準に準拠したNFTコントラクト
  • 包括的なテストスイート: コントラクトの全機能をテスト
  • デプロイスクリプト: ローカル/テストネットワークへのデプロイ用

機能

  • ✅ ERC721準拠のNFT
  • ✅ オーナーのみmint可能
  • ✅ 転送・承認機能
  • ✅ オーナーシップ管理
  • ✅ 包括的テストカバレッジ

セットアップ

前提条件

  • Node.js (v16以上)
  • npm または yarn

インストール

# プロジェクトディレクトリに移動
cd /Users/ringo/Documents/2025/work_nft/example01

# 依存関係をインストール(既に完了済み)
npm install

使用方法

1. コンパイル

npm run compile

2. テスト実行

# 全テストを実行
npm test

# または直接Hardhatコマンドを使用
npx hardhat test

3. ローカルネットワークでの開発

別のターミナルでローカルネットワークを起動:

npm run node

コントラクトをローカルネットワークにデプロイ:

npm run deploy:local

4. Hardhat内部ネットワークでのテスト

npm run deploy

5. テストネットワークへのデプロイ

5.1 環境設定

  1. .envファイルを編集して以下を設定:
# Sepolia テストネット用
SEPOLIA_URL=https://sepolia.infura.io/v3/YOUR_INFURA_PROJECT_ID
PRIVATE_KEY=your_test_account_private_key_here
ETHERSCAN_API_KEY=your_etherscan_api_key_here

# Mumbai テストネット用(オプション)
MUMBAI_URL=https://polygon-mumbai.infura.io/v3/YOUR_INFURA_PROJECT_ID
POLYGONSCAN_API_KEY=your_polygonscan_api_key_here

5.2 API URLの取得方法

Infura:

  1. Infuraでアカウント作成
  2. 新しいプロジェクトを作成
  3. プロジェクトIDをコピーして上記URLに設定

Alchemy(代替):

  1. Alchemyでアカウント作成
  2. アプリを作成(Sepolia/Mumbai選択)
  3. API KeyをコピーしてURLを設定:
    • Sepolia: https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY
    • Mumbai: https://polygon-mumbai.g.alchemy.com/v2/YOUR_API_KEY

5.3 テストETHの取得

Sepolia ETH:

Mumbai MATIC:

5.4 デプロイ実行

# Sepolia テストネットにデプロイ
npm run deploy:sepolia

# Mumbai テストネットにデプロイ
npm run deploy:mumbai

5.5 コントラクト検証(オプション)

# Sepoliaで検証
npm run verify:sepolia <CONTRACT_ADDRESS>

# Mumbaiで検証
npm run verify:mumbai <CONTRACT_ADDRESS>

コントラクト仕様

MyNFT.sol

  • 名前: MyNFT
  • シンボル: MNFT
  • 標準: ERC721
  • 機能:
    • mint(address to): オーナーのみがNFTをmint可能
    • tokenURI(uint256 tokenId): 固定のメタデータURIを返す
    • ERC721の標準機能(転送、承認など)

テスト構成

テストは以下の項目をカバーしています:

  1. デプロイメント

    • オーナー設定の確認
    • 名前・シンボルの確認
    • 初期供給量の確認
  2. Mint機能

    • オーナーによるmint
    • トークンIDの連番確認
    • 非オーナーのmint拒否
    • イベント発行の確認
  3. Token URI

    • URI取得の確認
    • 全トークンで同一URI
  4. 転送機能

    • オーナーによる転送
    • 承認済みアドレスによる転送
    • 未承認転送の拒否
  5. 承認機能

    • 個別承認
    • 全承認
    • イベント発行
  6. オーナーシップ

    • オーナー変更
    • 新オーナーの権限確認
  7. エッジケース

    • 存在しないトークンの処理
    • ゼロアドレスへのmint拒否

サポートネットワーク

ネットワーク チェーンID 通貨 エクスプローラー
Hardhat 1337 ETH -
Localhost 1337 ETH -
Sepolia 11155111 SepoliaETH Etherscan
Mumbai 80001 MATIC PolygonScan

ディレクトリ構造

example01/
├── contracts/
│   └── MyNFT.sol          # NFTコントラクト
├── test/
│   └── MyNFT.test.js      # テストファイル
├── scripts/
│   └── deploy.js          # デプロイスクリプト
├── hardhat.config.js      # Hardhat設定
├── package.json           # プロジェクト設定
├── .env.example           # 環境変数テンプレート
├── .env                   # 実際の環境変数(Git除外)
├── .gitignore            # Git除外設定
└── README.md             # このファイル

開発のヒント

コンソールでの操作

Hardhatコンソールを使用してコントラクトとやり取りできます:

npx hardhat console --network localhost

コンソール内での操作例:

// コントラクトインスタンス取得
const MyNFT = await ethers.getContractFactory("MyNFT");
const myNFT = await MyNFT.attach("コントラクトアドレス");

// アドレス取得
const [owner, user1] = await ethers.getSigners();

// NFTをmint
await myNFT.mint(user1.address);

// 残高確認
await myNFT.balanceOf(user1.address);

// オーナー確認
await myNFT.ownerOf(1);

カスタムネットワークの設定

hardhat.config.jsでテストネットワークを追加できます:

networks: {
  sepolia: {
    url: "YOUR_INFURA_OR_ALCHEMY_URL",
    accounts: ["YOUR_PRIVATE_KEY"]
  }
}

トラブルシューティング

よくある問題

  1. コンパイルエラー

    • Solidityバージョンを確認してください
    • OpenZeppelinコントラクトが正しくインストールされているか確認
  2. テスト失敗

    • npm installで依存関係が正しくインストールされているか確認
    • Node.jsのバージョンを確認(v16以上推奨)
  3. デプロイエラー

    • ネットワーク設定を確認
    • 十分なETH/MATIC残高があるか確認
    • .envファイルの設定を確認
  4. テストネットデプロイ固有の問題

    • "insufficient funds": テストネットの残高不足
      • 解決策: Faucetからテスト通貨を取得
    • "invalid api key": API URLまたはキーが無効
      • 解決策: Infura/AlchemyのプロジェクトIDを確認
    • "nonce too high": アカウントのナンス不整合
      • 解決策: MetaMaskでアカウントをリセット
    • "network not supported": ネットワーク設定エラー
      • 解決策: hardhat.config.jsの設定を確認

環境変数設定例

# .env ファイルの例
SEPOLIA_URL=https://sepolia.infura.io/v3/abc123def456
PRIVATE_KEY=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
ETHERSCAN_API_KEY=ABC123DEF456GHI789

⚠️ セキュリティ注意事項:

  • 秘密鍵は必ずテスト用アカウントのものを使用
  • .envファイルは絶対にGitにコミットしない
  • 本番環境(メインネット)では使用しない

ライセンス

本アプリは「独自ライセンス」に基づき公開しています。

ライセンス内容

  • 利用・複製・改変:自由に行えます。
  • 配布・再配布:禁止します。
  • 商用利用:禁止します。
  • 著作権表示:本アプリの著作権表示を削除しないでください。
  • 無保証:本アプリの利用によるいかなる損害も、作者は一切責任を負いません。

詳細説明

本アプリのソースコードおよび成果物は、個人または組織内での利用・複製・改変は許可しますが、 第三者への配布や再配布、または商用目的での利用・販売・公開は禁止します。 また、著作権表示および本ライセンス文は削除せず、必ず残してください。

ご不明点があれば、リポジトリ管理者までご連絡ください。

貢献

プルリクエストを歓迎します。大きな変更の場合は、まずissueを開いて変更内容を議論してください。

About

OpenZeppelinとHardhatを使用したシンプルなERC721 NFTスマートコントラクトです。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages