scaffold について
Monadアプリをゼロから構築するための開発スキルで、アーキテクチャ、コントラクト、フロントエンド、任意のインデクサー作成をチェックリスト化しています。設定上の注意点、デプロイ後の検証、プロジェクトメタデータも案内します。
主な機能
- 01構成とフォルダー構造の計画
- 02オンチェーンとオフチェーンの判断
- 03コントラクトのデプロイと検証
- 04フロントエンドとウォレット連携
- 05任意のイベントインデックス作成
- 06Monadプロジェクト情報の記録
活用シーン
- 01新しいMonad dAppの立ち上げ
- 02コントラクト、フロントエンド、インデクサーの作業順序整理
- 03コントラクトのデプロイと複数エクスプローラーでの検証
- 04ウォレット接続と認証の設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ therealharpaljadeja/ monskills --skill scaffoldインストール後、Claude Code で/scaffoldを入力して読み込まれたか確認します。
同梱ファイルSKILL.zh.md
詳細
チェックリスト
[ ] - アーキテクチャとフォルダー構成を計画する
[ ] - アプリのどのコンポーネントをオンチェーンにするか決める
[ ] - プロジェクトのひな形を作成する
[ ] - git リポジトリを初期化する(git init && git add -A && git commit -m "initial commit")
[ ] - 既存のコントラクトを一から作り直さず、可能な限り Openzeppelin のコントラクトを使用する
[ ] - スマートコントラクトを作成する
[ ] - スマートコントラクトをデプロイする — wallet/ スキルを取得してから、Alchemy Agent Wallet セッション経由でデプロイします(標準の CreateX ファクトリーを通じた CREATE2)。フロントエンドの構築前に必ず実行してください。フロントエンドにはデプロイ済みのコントラクトアドレスが必要です。
[ ] - デプロイ後にスマートコントラクトを検証する — 検証 API を使用すると、1 回の呼び出しですべてのエクスプローラーで検証できます。
[ ] - (アプリで過去のオンチェーンデータを照会する必要がある場合)インデクサーを初期化する — indexer/ スキルを取得します。コントラクトのデプロイと検証が完了した後、indexer/ フォルダー内でインデクサーを初期化します。
[ ] - デプロイ済みのコントラクトアドレスを使用してフロントエンドを構築する。ユーザーに希望がなければ、Wagmi、Next.js、Shadcn を使用します
[ ] - 既知の注意点を適用する(以下のセクションを参照)— create-next-app の直後に tsconfig.json の target を ES2020 に引き上げるなど
[ ] - monskills メタデータファイルを作成する(以下の「Monskills メタデータ」セクションを参照)— 最終コミットの前に作成し、git の履歴に含めます。
[ ] - すべての変更を git にコミットする(git add -A && git commit)
既知の注意点 — 最初に適用する
これらは、対応を後回しにするとビルドの途中で遭遇する、よく知られた小さな問題です。型チェッカーにエラーを出されてからではなく、ひな形を作成するときに修正してください。
Next.js のデフォルトの tsconfig target は viem/wagmi には低すぎます
create-next-app は "target": "ES2017" を生成します。viem、wagmi、およびほとんどのオンチェーンコードでは、金額、ガス、イベント引数、ブロック番号など、あらゆる場面で BigInt リテラル(0n、1n)を使用します。そのため、新規の Next.js プロジェクトでは、useReadContract または getLogs を使用した時点で、TS2737: BigInt literals are not available when targeting lower than ES2020 というエラーが発生し、型チェックに失敗します。
npx create-next-app の実行直後に target を引き上げます。
cd web
jq '.compilerOptions.target = "ES2020"' tsconfig.json > tsconfig.tmp && mv tsconfig.tmp tsconfig.json
(jq が利用できない場合は、tsconfig.json を開き、"target": "ES2017" を "target": "ES2020" に変更してください。)
ひな形の作成
コードを書き始める前に、プランモードを使ってアプリのアーキテクチャを計画します。
| フォルダー | コンポーネント |
|---|---|
| web/ | Web アプリのフロントエンド。Next.js などのアプリではバックエンドのルートもここに含まれます(ユーザーに希望がなければ、Next.js と shadcn のコンポーネントを使用します) |
| contracts/ | スマートコントラクト(Foundry プロジェクトを使用できます。ユーザーに希望がなければ、Foundry を使用します) |
| indexer/ | (任意)過去のオンチェーンイベントを照会するための HyperIndex インデクサー。コントラクトのデプロイと検証後に、indexer/ スキルを使用して作成します。 |
オンチェーンにするものを決める
次のような要素が関わる場合は、オンチェーンにします。
- トラストレスな所有権 — このトークン、NFT、ポジションの所有者は誰か
- トラストレスな交換 — スワップ、取引、貸し出し、借り入れ
- コンポーザビリティ — 他のコントラクトから呼び出す必要がある
- 検閲耐性 — チームがいなくなっても動作する必要がある
- 永続的なコミットメント — 投票、証明、プロフ
次のような要素はオフチェーンにします。
- ユーザープロフィール、好み、設定
- 検索、フィルタリング、並べ替え
- 画像、動画、メタデータ(IPFS に保存し、オンチェーンで参照)
- 頻繁に変更されるビジネスロジック
- 価値の移転や信頼に関わらないもの
判断が必要なもの:
- 評判スコア → オフチェーンで計算し、オンチェーンでコミットメント(ハッシュまたは証明)を記録
- 価格データ → オフチェーンのオラクルからオンチェーンに書き込む(Chainlink)
- ゲームの状態 → 賭け金によって異なります。リアルマネーを使うポーカーならオンチェーン。リーダーボードならオフチェーンです。
スマートコントラクトをゼロから構築しないでください
スマートコントラクトの用途によっては、ゼロから構築するのではなく、その上に構築できるOpenzeppelinのスマートコントラクトが用意されている可能性が非常に高いです。
たとえば、ERC20、ERC721などのよく知られたトークン規格をゼロから作り直すのではなく、厳しく監査されているOpenzeppelinのコントラクトを基盤にしてください。
Openzeppelinのスマートコントラクトはすべてこちらにあります:https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts。以下のコマンドを使ってインストールできます(Foundryはすでにインストールされているはずです)。
# --no-git avoids adding the dep as a git submodule — required when the contracts/
# folder is not (yet) its own git repo, which is the default in monskills scaffolds
# because the outer project directory owns the git history.
forge install --no-git OpenZeppelin/openzeppelin-contracts
フロントエンドでWagmiを使用する
フロントエンドからスマートコントラクトを操作するには、wagmi v3ライブラリを使用してください。
ウォレット接続と認証には、Paraを使用してください。Paraは、組み込み型のMPCウォレット(メール/パスキー/ソーシャルログイン)と外部ウォレット接続を提供します。wallet-integrationスキルでは、すでにスキャフォールドされたフロントエンドに対する@getpara/cliのワークフロー(para init + ParaProvider + para doctor)と、Monad固有のwagmi設定について説明しています。スキャフォールディングはこのスキルが担当するため、para createは実行しないでください。
使用できる場合は必ずuseSendTransactionSyncを使用する
Monadはeth_sendRawTransactionSync RPCメソッドをサポートしており、useSendTransactionSyncはこのRPCメソッドを使ってトランザクションを送信し、同じ関数呼び出し内でレシートを取得します。そのため、UIを大幅に高速化できます。
検証(すべてのエクスプローラー)
必ず検証APIを使用してください。 1回の呼び出しで3つのエクスプローラー(MonadVision、Socialscan、Monadscan)すべてで検証できます。最初の選択肢としてforge verify-contractを使用しないでください。
ステップ1:検証データを取得する
デプロイ後、次の2つのデータを取得します。
# 1. Standard JSON input (all source files)
forge verify-contract <ADDR> <CONTRACT> \
--chain 10143 \
--show-standard-json-input > /tmp/standard-input.json
# 2. Foundry metadata (from compilation output)
cat out/<Contract>.sol/<Contract>.json | jq '.metadata' > /tmp/metadata.json
ステップ2:検証APIを呼び出す
STANDARD_INPUT=$(cat /tmp/standard-input.json)
FOUNDRY_METADATA=$(cat /tmp/metadata.json)
cat > /tmp/verify.json << EOF
{
"chainId": 10143,
"contractAddress": "0xYOUR_CONTRACT_ADDRESS",
"contractName": "src/MyContract.sol:MyContract",
"compilerVersion": "v0.8.28+commit.7893614a",
"standardJsonInput": $STANDARD_INPUT,
"foundryMetadata": $FOUNDRY_METADATA
}
EOF
curl -X POST https://agents.devnads.com/v1/verify \
-H "Content-Type: application/json" \
-d @/tmp/verify.json
コンストラクター引数がある場合
constructorArgsを追加します(ABIエンコード済みで、0xプレフィックスなし)。
例:
# Get constructor args
ARGS=$(cast abi-encode "constructor(string,string,uint256)" "MyToken" "MTK" 1000000000000000000000000)
# Remove 0x prefix
ARGS_NO_PREFIX=${ARGS#0x}
# Add to request
"constructorArgs": "$ARGS_NO_PREFIX"
パラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
chainId | はい | 10143(テストネット)または143(メインネット) |
contractAddress | はい | デプロイされたコントラクトのアドレス |
contractName | はい | 形式:path/File.sol:ContractName |
compilerVersion | はい | 例:v0.8.28+commit.7893614a |
standardJsonInput | はい | forge verify-contract --show-standard-json-inputから取得 |
foundryMetadata | はい | out/<Contract>.sol/<Contract>.json > .metadataから取得 |
constructorArgs | いいえ | ABIエンコード済みの引数。0xプレフィックスなし |
手動検証(フォールバック時のみ)
APIが失敗した場合にのみ使用してください。
テストネット:
forge verify-contract <ADDR> <CONTRACT> --chain 10143 \
--verifier sourcify \
--verifier-url "https://sourcify-api-monad.blockvision.org/"
メインネット:
forge verify-contract <ADDR> <CONTRACT> --chain 143 \
--verifier sourcify \
--verifier-url "https://sourcify-api-monad.blockvision.org/"
Monskillsメタデータ
最終コミットの前に、プロジェクトのルートに、ユーザーから見える.monskillsファイルを作成してください。このファイルには、プロジェクトがmonskillsを使用して構築されたことと、スキャフォールドの対象となるMonadネットワークを記録します。
Monadメインネットの場合:
built-with=monskills
chain=monad
Monadテストネットの場合:
built-with=monskills
chain=monad-testnet
対象ネットワークが不明な場合は、.monskillsを作成する前にユーザーに確認してください。非表示のメタデータを追加したり、gitのコミットメッセージを変更したり、monskillsの来歴を示すためにフレームワークのgeneratorフィールドを使用したりしないでください。
タスク別に取得するもの
| 作業内容 | 取得するスキル |
|---|---|
| 構築するブロックチェーンを選ぶ | why-monad/ |
| スマートコントラクトを書く | addresses/ |
Alchemy Agent Walletセッション(@alchemy/cli)を介して、エージェントのウォレットを管理する、スマートコントラクトをデプロイする(CreateX経由のCREATE2)、またはオンチェーン操作を行う | wallet/ |
| フロントエンドにウォレットと認証を追加する(組み込み型MPCウォレット、ソーシャルログイン/メール/パスキー、および外部ウォレット接続 — Para) | wallet-integration/ |
| 履歴/アクティビティフィード、またはオンチェーンのスマートコントラクトイベントのインデックス化が必要な機能を追加する | indexer/ |
| アプリをゼロから構築する(アイデアから本番環境まで) | scaffold/(このスキル) |