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 installnpm run compile# 全テストを実行
npm test
# または直接Hardhatコマンドを使用
npx hardhat test別のターミナルでローカルネットワークを起動:
npm run nodeコントラクトをローカルネットワークにデプロイ:
npm run deploy:localnpm run deploy.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_hereInfura:
- Infuraでアカウント作成
- 新しいプロジェクトを作成
- プロジェクトIDをコピーして上記URLに設定
Alchemy(代替):
- Alchemyでアカウント作成
- アプリを作成(Sepolia/Mumbai選択)
- 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
- Sepolia:
Sepolia ETH:
Mumbai MATIC:
# Sepolia テストネットにデプロイ
npm run deploy:sepolia
# Mumbai テストネットにデプロイ
npm run deploy:mumbai# Sepoliaで検証
npm run verify:sepolia <CONTRACT_ADDRESS>
# Mumbaiで検証
npm run verify:mumbai <CONTRACT_ADDRESS>- 名前: MyNFT
- シンボル: MNFT
- 標準: ERC721
- 機能:
mint(address to): オーナーのみがNFTをmint可能tokenURI(uint256 tokenId): 固定のメタデータURIを返す- ERC721の標準機能(転送、承認など)
テストは以下の項目をカバーしています:
-
デプロイメント
- オーナー設定の確認
- 名前・シンボルの確認
- 初期供給量の確認
-
Mint機能
- オーナーによるmint
- トークンIDの連番確認
- 非オーナーのmint拒否
- イベント発行の確認
-
Token URI
- URI取得の確認
- 全トークンで同一URI
-
転送機能
- オーナーによる転送
- 承認済みアドレスによる転送
- 未承認転送の拒否
-
承認機能
- 個別承認
- 全承認
- イベント発行
-
オーナーシップ
- オーナー変更
- 新オーナーの権限確認
-
エッジケース
- 存在しないトークンの処理
- ゼロアドレスへの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"]
}
}-
コンパイルエラー
- Solidityバージョンを確認してください
- OpenZeppelinコントラクトが正しくインストールされているか確認
-
テスト失敗
npm installで依存関係が正しくインストールされているか確認- Node.jsのバージョンを確認(v16以上推奨)
-
デプロイエラー
- ネットワーク設定を確認
- 十分なETH/MATIC残高があるか確認
.envファイルの設定を確認
-
テストネットデプロイ固有の問題
- "insufficient funds": テストネットの残高不足
- 解決策: Faucetからテスト通貨を取得
- "invalid api key": API URLまたはキーが無効
- 解決策: Infura/AlchemyのプロジェクトIDを確認
- "nonce too high": アカウントのナンス不整合
- 解決策: MetaMaskでアカウントをリセット
- "network not supported": ネットワーク設定エラー
- 解決策:
hardhat.config.jsの設定を確認
- 解決策:
- "insufficient funds": テストネットの残高不足
# .env ファイルの例
SEPOLIA_URL=https://sepolia.infura.io/v3/abc123def456
PRIVATE_KEY=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
ETHERSCAN_API_KEY=ABC123DEF456GHI789- 秘密鍵は必ずテスト用アカウントのものを使用
.envファイルは絶対にGitにコミットしない- 本番環境(メインネット)では使用しない
本アプリは「独自ライセンス」に基づき公開しています。
- 利用・複製・改変:自由に行えます。
- 配布・再配布:禁止します。
- 商用利用:禁止します。
- 著作権表示:本アプリの著作権表示を削除しないでください。
- 無保証:本アプリの利用によるいかなる損害も、作者は一切責任を負いません。
本アプリのソースコードおよび成果物は、個人または組織内での利用・複製・改変は許可しますが、 第三者への配布や再配布、または商用目的での利用・販売・公開は禁止します。 また、著作権表示および本ライセンス文は削除せず、必ず残してください。
ご不明点があれば、リポジトリ管理者までご連絡ください。
プルリクエストを歓迎します。大きな変更の場合は、まずissueを開いて変更内容を議論してください。