solidity-foundry-development について
Solidity 開発者向けの Foundry スキルです。プロジェクト設定、テスト、デバッグ、デプロイに加え、任意の solidity-agent-toolkit ワークフローを扱います。
主な機能
- 01Foundry プロジェクトの初期化と設定
- 02ユニット、ファズ、不変条件、フォークテスト
- 03デプロイスクリプトとソース検証
- 04チートコードとデバッグのガイダンス
- 05任意の solidity-agent-toolkit ワークフロー
活用シーン
- 01Foundry で Solidity プロジェクトを開始
- 02ランダム入力やフォーク状態でコントラクトをテスト
- 03Solidity のデプロイを準備して検証
- 04コントラクト成果物の確認とセキュリティ検査
MCP 対応
solidity-agent-toolkit が利用可能な場合、コントラクトのコンパイルとテスト、成果物やストレージの確認、ガス見積もり、デプロイのシミュレーション、セキュリティスキャンを行う MCP ツールを紹介します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ whackur/ solidity-agent-toolkit --skill solidity-foundry-developmentインストール後、Claude Code で/solidity-foundry-developmentを入力して読み込まれたか確認します。
同梱ファイルreferences/foundry-cheatsheet.md
詳細
Foundry 開発ガイド
適用する場合
Foundry ツールキットを使用する Solidity プロジェクトで作業する際に、このスキルを適用してください。新しいプロジェクトのセットアップ、ユニットテストと統合テストの作成、ファズテストと不変条件テストの実施、フォークテストによるメインネット環境のシミュレーション、Solidity スクリプトを使用したデプロイの管理が含まれます。
プロジェクトのセットアップ
forge init でプロジェクトを初期化します。forge install <author>/<repo> で依存関係を管理します。リマッピング、オプティマイザー設定、EVM バージョンを指定するには、foundry.toml を設定します。インポートを簡潔にするには、remappings.txt を使用します(例:@openzeppelin/=lib/openzeppelin-contracts/contracts/)。
テストのベストプラクティス
テスト構成
テストでは forge-std/Test.sol を継承してください。状態の初期化には setUp() を使用します。
test_Xxx:標準的なテストケースです。testFuzz_Xxx:ファズテストのケースです。testFail_Xxx:失敗を想定するテストです(vm.expectRevertを推奨します)。
ファズテスト
Foundry は、testFuzz 関数の引数にランダムな入力を自動的に指定します。入力をフィルタリングするには vm.assume() を使用するか、値を制限するには bound(uint256 x, uint256 min, uint256 max) を使用します。
不変条件テスト
複数のトランザクションにわたってプロパティが維持されることを確認する、ステートフルなファズテストです。
targetContract(address):テスト対象のコントラクトを定義します。handler:複雑な呼び出しシーケンスと状態遷移を管理する専用コントラクトを使用します。
フォークテスト
RPC URL を指定して、メインネットの状態をシミュレートします。
vm.createFork(url):フォークを作成します。vm.selectFork(id):フォークを切り替えます。vm.rollFork(blockNumber):フォークを特定のブロックに固定します。
必須のチートコード
| チートコード | 説明 |
|---|---|
vm.prank(addr) | 次の呼び出しに対して msg.sender を設定します。 |
vm.startPrank(addr) | stopPrank が呼び出されるまで、以降のすべての呼び出しに対して msg.sender を設定します。 |
vm.deal(addr, amt) | アドレスの残高を設定します。 |
vm.expectRevert(bytes) | 次の呼び出しが特定のエラーでリバートすることを期待します。 |
vm.expectEmit(bool,bool,bool,bool) | 次の呼び出しで特定のイベントが発行されることを期待します。 |
vm.warp(timestamp) | ブロックのタイムスタンプを設定します。 |
vm.roll(blockNumber) | ブロック番号を設定します。 |
vm.sign(pk, digest) | ECDSA 署名を生成します。 |
vm.label(addr, name) | トレースを読みやすくするためにアドレスにラベルを付けます。 |
vm.record() | すべてのストレージの読み取りと書き込みの記録を開始します。 |
vm.getCode(path) | コントラクトの作成用バイトコードを返します。 |
デプロイのワークフロー
Solidity ベースのデプロイには forge script を使用します。
- ドライラン:
forge script script/Deploy.s.sol --rpc-url $RPC_URL - ブロードキャスト:
forge script script/Deploy.s.sol --rpc-url $RPC_URL --broadcast --verify - ソースコードを自動検証するには、
--etherscan-api-keyとともに--verifyを使用します。
デバッグ
- 詳細度:
-v(ログ)、-vv(失敗したテストのトレース)、-vvv(すべてのテストのトレース)、-vvvv(セットアップのトレース)、-vvvvv(完全なスタックトレース)。 forge debug:特定のトランザクションを対話形式でデバッグします。console.log:プリントデバッグにはforge-std/console.solを使用します。
設定プロファイル
異なるビルド設定を管理するには、foundry.toml のプロファイルを使用します。
[profile.via_ir]
via_ir = true
test = 'src'
out = 'via_ir-out'
[profile.deterministic]
block_number = 17722462
block_timestamp = 1689711647
bytecode_hash = 'none'
cbor_metadata = false
MCP で強化
solidity-agent-toolkit が利用可能な場合は、Foundry のワークフローで以下のツールを活用してください。
ビルドとテスト:
compile_contract:コントラクトをコンパイルし、成果物(ABI、バイトコード、エラー)を取得しますrun_tests:詳細度を指定して、Foundry のテストスイート全体を実行しますrun_single_test:特定のテスト関数を対象にして、すばやく反復します
成果物と検査:
get_abi:コンパイル済みコントラクトから ABI を抽出しますget_bytecode:デプロイ用または実行時のバイトコードを取得しますinspect_storage:最適化やデバッグのためにストレージレイアウトを検査しますgas_snapshot:テスト実行間のガスレポートを生成して比較しますestimate_gas:特定の関数呼び出しに必要なガスを見積もります
デプロイ:
dry_run_deploy:ブロードキャスト前にデプロイをシミュレートして、エラーを検出しますcheck_deployment_status:デプロイトランザクションのステータスを確認します
セキュリティ(コミット前):
run_slither:コードをプッシュする前に静的解析を実行しますrun_aderyn:Rust ベースの高速な脆弱性スキャンを実行しますmatch_vulnerability_patterns:変更したファイルのパターンをすばやく確認します
参考資料
コマンドの詳細なリファレンスとパターンについては、Foundry Cheatsheet を参照してください。