mcpField
M
monad-development

monad-development

github.com/portdeveloper開発136 回インストール38 週間前に更新
リポジトリ

monad-development について

monad-developmentは、Foundryを使ったMonad上の開発とコントラクトデプロイをエージェントに案内するスキルです。ネットワークの既定値、デプロイと検証の手順、ウォレット管理方法を示します。

主な機能

  1. 01Monadテストネットとメインネットの情報
  2. 02Foundryによるコントラクトデプロイ手順
  3. 03コントラクト検証の手順
  4. 04ウォレット永続化の案内
  5. 05Monad向けフロントエンド設定

活用シーン

  1. 01Monadテストネットへのコントラクトデプロイ
  2. 02デプロイ済みコントラクトのエクスプローラー検証
  3. 03デプロイ用ウォレットの作成と資金調達
  4. 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 は使用しません)
  • ウォレット: ウォレットを生成した場合は、必ず永続化します(「ウォレットの永続化」セクションを参照)
ネットワーク
ネットワークチェーン IDRPC
Testnet10143https://testnet-rpc.monad.xyz
Mainnet143https://rpc.monad.xyz

ドキュメント:https://docs.monad.xyz

エクスプローラー
エクスプローラーTestnetMainnet
Socialscanhttps://monad-testnet.socialscan.iohttps://monad.socialscan.io
MonadVisionhttps://testnet.monadvision.comhttps://monadvision.com
Monadscanhttps://testnet.monadscan.comhttps://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/"

ウォレットの永続化

エージェントにとって重要: ユーザー用にウォレットを生成した場合は、今後も使用できるよう必ず永続化してください。

新しいウォレットを生成する場合:

  1. ウォレットを作成します:cast wallet new
  2. 直ちにアドレスと秘密鍵を安全な場所に保存します
  3. ウォレット情報の保存場所をユーザーに伝えます
  4. デプロイ前に 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//')\"
  }"

コメント