monad-development について
monad-developmentは、Foundryを使ったMonad上の開発とコントラクトデプロイをエージェントに案内するスキルです。ネットワークの既定値、デプロイと検証の手順、ウォレット管理方法を示します。
主な機能
- 01Monadテストネットとメインネットの情報
- 02Foundryによるコントラクトデプロイ手順
- 03コントラクト検証の手順
- 04ウォレット永続化の案内
- 05Monad向けフロントエンド設定
活用シーン
- 01Monadテストネットへのコントラクトデプロイ
- 02デプロイ済みコントラクトのエクスプローラー検証
- 03デプロイ用ウォレットの作成と資金調達
- 04Monadテストネット向けフロントエンドの設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ portdeveloper/ skills --skill monad-developmentインストール後、Claude Code で/monad-developmentを入力して読み込まれたか確認します。
詳細
Monad 開発
ここに記載されていない質問については、https://docs.monad.xyz/llms.txt を取得してください。
クイックリファレンス
デフォルト設定
- ネットワーク: ユーザーが「mainnet」と指定しない限り、常に testnet(チェーン ID 10143)を使用します
- 検証: ユーザーが不要と指定しない限り、デプロイ後は必ずコントラクトを検証します
- フレームワーク: Foundry を使用します(Hardhat は使用しません)
- ウォレット: ウォレットを生成した場合は、必ず永続化します(「ウォレットの永続化」セクションを参照)
ネットワーク
| ネットワーク | チェーン ID | RPC |
|---|---|---|
| Testnet | 10143 | https://testnet-rpc.monad.xyz |
| Mainnet | 143 | https://rpc.monad.xyz |
ドキュメント:https://docs.monad.xyz
エクスプローラー
| エクスプローラー | Testnet | Mainnet |
|---|---|---|
| Socialscan | https://monad-testnet.socialscan.io | https://monad.socialscan.io |
| MonadVision | https://testnet.monadvision.com | https://monadvision.com |
| Monadscan | https://testnet.monadscan.com | https://monadscan.com |
エージェント API
重要: ブラウザーは使用しないでください。これらの API を curl で直接使用します。
Faucet(Testnet の資金調達):
curl -X POST https://agents.devnads.com/v1/faucet \
-H "Content-Type: application/json" \
-d '{"chainId": 10143, "address": "0xYOUR_ADDRESS"}'
戻り値:{"txHash": "0x...", "amount": "1000000000000000000", "chain": "Monad Testnet"}
フォールバック(公式 faucet): https://faucet.monad.xyz エージェント用 faucet が失敗した場合は、公式 faucet 経由で資金を送るようユーザーに依頼してください(自身ではブラウザーを使用しないでください)。
検証(すべてのエクスプローラー):
必ず最初に検証 API を使用してください。1 回の呼び出しで 3 つのエクスプローラー(MonadVision、Socialscan、Monadscan)すべてで検証できます。最初の選択肢として forge verify-contract を使用しないでください。
# 1. Get verification data
forge verify-contract <ADDR> <CONTRACT> \
--chain 10143 \
--show-standard-json-input > /tmp/standard-input.json
cat out/<Contract>.sol/<Contract>.json | jq '.metadata' > /tmp/metadata.json
COMPILER_VERSION=$(jq -r '.metadata | fromjson | .compiler.version' out/<Contract>.sol/<Contract>.json)
# 2. Call verification 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": "v${COMPILER_VERSION}",
"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 プレフィックスなし):
ARGS=$(cast abi-encode "constructor(string,string,uint256)" "MyToken" "MTK" 1000000000000000000000000)
ARGS_NO_PREFIX=${ARGS#0x}
# Add to request: "constructorArgs": "$ARGS_NO_PREFIX"
手動検証のフォールバック(API が失敗した場合):
forge verify-contract <ADDR> <CONTRACT> --chain 10143 \
--verifier sourcify \
--verifier-url "https://sourcify-api-monad.blockvision.org/"
ウォレットの永続化
エージェントにとって重要: ユーザー用にウォレットを生成した場合は、今後も使用できるよう必ず永続化してください。
新しいウォレットを生成する場合:
- ウォレットを作成します:
cast wallet new - 直ちにアドレスと秘密鍵を安全な場所に保存します
- ウォレット情報の保存場所をユーザーに伝えます
- デプロイ前に faucet 経由でウォレットに資金を送ります
保存方法:
~/.monad-walletに書き込み、chmod 600 を設定する- プロジェクト固有の
.envファイルに保存する(.gitignore に追加する) - 認証情報をユーザーに渡し、安全に保存するよう依頼する
重要な理由: ユーザーがウォレットにアクセスできる必要があるのは、次の操作を行うためです:
- 追加のコントラクトをデプロイする
- デプロイ済みのコントラクトとやり取りする
- 資金を管理する
- 所有権を検証する
デプロイのワークフロー
デプロイには forge script を使用します:
forge script script/Deploy.s.sol:DeployScript \
--rpc-url https://testnet-rpc.monad.xyz \
--private-key $PRIVATE_KEY \
--broadcast
デプロイスクリプトのテンプレート:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
import "forge-std/Script.sol";
import "../src/MyContract.sol";
contract DeployScript is Script {
function run() external {
vm.startBroadcast();
MyContract contract = new MyContract();
console.log("Contract deployed at:", address(contract));
vm.stopBroadcast();
}
}
技術詳細
EVM バージョン(重要)
常に evmVersion: "prague" を設定してください。Solidity 0.8.27 以降が必要です。
Foundry(foundry.toml):
[profile.default]
evm_version = "prague"
solc_version = "0.8.28"
Foundry のヒント
存在しないフラグ(使用しないでください):
--no-commit-forge initまたはforge installで有効なフラグではありません
デプロイには forge create ではなく forge script を使用します:
forge create --broadcast には不具合があり、無視されることもよくあります。代わりに forge script を使用してください。
forge script script/Deploy.s.sol:DeployScript \
--rpc-url https://testnet-rpc.monad.xyz \
--private-key $PRIVATE_KEY \
--broadcast
デプロイスクリプトでアドレスをハードコードしてはいけません:
// ✅ Correct - reads private key from --private-key flag
function run() external {
vm.startBroadcast();
new MyContract();
vm.stopBroadcast();
}
// ❌ Wrong - hardcodes address, causes "No associated wallet" error
function run() external {
vm.startBroadcast(0x1234...);
}
フロントエンド
viem/chains からインポートします。カスタムチェーンを定義しないでください:
import { monadTestnet } from "viem/chains";
wagmi での使用方法:
import { createConfig, http } from 'wagmi'
import { monadTestnet } from 'viem/chains'
const config = createConfig({
chains: [monadTestnet],
transports: {
[monadTestnet.id]: http()
}
})
例:ERC20 のデプロイ
1. プロジェクトを作成します:
forge init my-token
cd my-token
2. foundry.toml を設定します:
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
evm_version = "prague"
solc_version = "0.8.28"
3. コントラクト src/MyToken.sol を作成します:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor(uint256 initialSupply) ERC20("MyToken", "MTK") {
_mint(msg.sender, initialSupply);
}
}
4. 依存関係をインストールします:
forge install OpenZeppelin/openzeppelin-contracts --no-commit
5. デプロイスクリプト script/Deploy.s.sol を作成します:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
import "forge-std/Script.sol";
import "../src/MyToken.sol";
contract DeployScript is Script {
function run() external {
vm.startBroadcast();
MyToken token = new MyToken(1000000 * 10**18);
console.log("Token deployed at:", address(token));
vm.stopBroadcast();
}
}
6. デプロイします:
forge script script/Deploy.s.sol:DeployScript \
--rpc-url https://testnet-rpc.monad.xyz \
--private-key $PRIVATE_KEY \
--broadcast
7. 検証します:
# Use verification API (verifies on all explorers)
STANDARD_INPUT=$(forge verify-contract <TOKEN_ADDRESS> src/MyToken.sol:MyToken --chain 10143 --show-standard-json-input)
COMPILER_VERSION=$(jq -r '.metadata | fromjson | .compiler.version' out/MyToken.sol/MyToken.json)
curl -X POST https://agents.devnads.com/v1/verify \
-H "Content-Type: application/json" \
-d "{
\"chainId\": 10143,
\"contractAddress\": \"<TOKEN_ADDRESS>\",
\"contractName\": \"src/MyToken.sol:MyToken\",
\"compilerVersion\": \"v${COMPILER_VERSION}\",
\"standardJsonInput\": $STANDARD_INPUT,
\"constructorArgs\": \"$(cast abi-encode 'constructor(uint256)' 1000000000000000000000000 | sed 's/0x//')\"
}"