Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

goshuin-nft

御朱印インボイスNFT — スマートコントラクト

参拝記録をブロックチェーン上に永久保存するERC-721スマートコントラクト。 天気・時間帯・おみくじ・奉納金額などの参拝データを完全オンチェーンで管理。


プロジェクト概要

goshuin-ar-hounouの奉納決済システムと連携するNFTコントラクト。参拝証明をインボイス(領収書)として機能するNFTとして発行する。


インボイスNFTとは

普通の領収書 インボイスNFT
紙やPDFで発行 ブロックチェーンに永久記録
改ざん可能 改ざん不可能
発行者が潰れると消える 永久に残る
再発行できない 世界中から確認できる

NFTに刻まれるデータ

struct HounouRecord {
    string shrine;      // 神社名
    string date;        // 参拝日時(和暦)
    string weather;     // 天気(clear / rain / snow)
    string timeOfDay;   // 時間帯(morning / midday / evening / night)
    string blessing;    // おみくじ(心願成就・大吉福徳など)
    string lang;        // 言語(ja / en)
    uint256 amount;     // 奉納金額(円)
    uint256 timestamp;  // ブロックタイムスタンプ
}

動的メタデータ

NFTのメタデータはIPFSの静的ファイルではなく、APIで動的生成:

tokenURI → https://goshuin-ar-hounou.vercel.app/api/metadata?tokenId=N
    ↓
コントラクトから参拝記録を読み取り
    ↓
{
  "name": "御朱印インボイスNFT #42 — 黄昏時の雨天 — 厄除開運",
  "description": "令和7年3月21日、黄昏時に飛梅天満宮を参拝。",
  "image": "ipfs://...",
  "attributes": [...]
}

特定日判定

日付 NFT名称 画像
1月1日〜3日 新春大吉 疾風迅雷(金色)
毎月25日 天神縁日 疾風迅雷
毎月1日 朔日奉拝 疾風迅雷
晴れの日 疾風迅雷 疾風迅雷
雨の日 雲外蒼天 雲外蒼天
雪の日 不撓不屈 不撓不屈

NFT画像(IPFS)

称号 CID 意味
疾風迅雷 bafybeigbxuy... 晴れ・力強い参拝
雲外蒼天 bafybeihljyb... 雨・希望の参拝
不撓不屈 bafybeiebgib... 雪・不屈の参拝

コントラクト情報

項目
コントラクト名 GoshuinInvoiceNFT
シンボル GOIN
Sepoliaアドレス 0x3A637bD5a5Ff49667Ff279BDa263c9118e7b2a03
オーナー 0x0a4a4F7F8D69Af17F8Dc69cadeBc5eD1B2e90716(goshuin-dev)
本番予定チェーン Polygon zkEVM

開発環境

Node.js: 22.x
Hardhat: 2.22.0
OpenZeppelin: 4.9.6(5系はHardhat 2と非互換)
Solidity: 0.8.28(evmVersion: cancun)

セットアップ

npm install
cp .env.example .env
# .envにSEPOLIA_RPC_URLとPRIVATE_KEYを設定

コンパイル

npx hardhat compile

ローカルテスト

# ターミナル1
npx hardhat node

# ターミナル2
npx hardhat run scripts/deploy.js --network localhost
npx hardhat run scripts/mint.js --network localhost

Sepoliaデプロイ

npx hardhat run scripts/deploy.js --network sepolia
npx hardhat run scripts/mint.js --network sepolia

Polygon zkEVMデプロイ(ETH補充後)

npx hardhat run scripts/deploy.js --network polygonZkEVM

スクリプト一覧

スクリプト 説明
scripts/deploy.js コントラクトをデプロイ
scripts/mint.js テスト用NFTを3枚ミント
scripts/transfer-ownership.js オーナー権限を移譲
scripts/metadata/ テスト用メタデータJSON

重要な実装メモ

OpenZeppelin 4.9.6を使う理由

5系(最新)はmcopyオペコードを使用
→ Hardhat 2のparis EVMと非互換
→ 必ず@4.9.6を指定すること
npm install @openzeppelin/contracts@4.9.6

_burnのオーバーライドが必要

// ERC721 + ERC721URIStorageの多重継承で必須
function _burn(uint256 tokenId)
    internal override(ERC721, ERC721URIStorage) {
    super._burn(tokenId);
}

デプロイ専用ウォレット分離

本番ウォレット(MO_world)→ 資産保管
goshuin-dev → NFTミント専用(最小限のETHのみ)

Polygon zkEVM移行手順(ETH補充後)

# 1. hardhat.config.jsにpolygonZkEVMネットワーク追加済み
# 2. .envにPOLYGON_ZKEVM_RPC_URLを設定済み
# 3. Polygon Bridgeでブリッジ(約0.005 ETH)
# 4. デプロイ
npx hardhat run scripts/deploy.js --network polygonZkEVM
# 5. Vercelの環境変数を更新
#    - SEPOLIA_RPC_URL → POLYGON_ZKEVM_RPC_URL
#    - 各APIのCONTRACT_ADDRESSを新しいアドレスに変更

関連リポジトリ


MAGATOKI Laboratory

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages