foundry-solidity について
foundry-solidityは、FoundryとSolidityによるEthereumおよびEVMスマートコントラクトの開発・テスト向けスキルです。Forgeテスト、デプロイ、チェーン操作、デバッグ、安全性、設定を扱います。
主な機能
- 01コントラクトのビルドとテスト手順
- 02ユニット、ファズ、不変条件、フォークテスト
- 03スクリプトによるデプロイと検証
- 04castによるチェーン呼び出しとトランザクション解析
- 05anvilによるローカル・フォークネットワーク
- 06セキュリティ、デバッグ、ガスの指針
活用シーン
- 01EthereumまたはEVMコントラクトの開発
- 02コントラクトの動作とガス使用量のテスト
- 03コントラクトのデプロイと検証
- 04トランザクションやコントラクト操作のデバッグ
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ tenequm/ skills --skill foundry-solidityインストール後、Claude Code で/foundry-solidityを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSE.txtreferences/anvil-advanced.mdcast-advanced.mdchisel.mdcicd.mdconfiguration.mddebugging.mddependencies.mddeployment.mdforge-std-api.mdgas-optimization.mdpatterns.mdresources.mdsecurity.mdsolidity-modern.mdtesting.md詳細
Foundry Solidity 開発
Foundry 1.5.0 と Solidity 0.8.30 を使用して、安全で効率的なスマートコントラクトを構築するための完全ガイドです。
このスキルを使用する場面
- Ethereum/EVM スマートコントラクトの開発
- Forge テスト(ユニット、ファズ、インバリアント、フォーク)の作成
- スクリプトを使用したコントラクトのデプロイ
- Foundry ツール(forge、cast、anvil、chisel)の使用
foundry.toml、*.t.sol、*.s.solファイルの操作- トランザクションとコントラクトのやり取りのデバッグ
クイックスタート
# Create new project
forge init my-project && cd my-project
# Build contracts
forge build
# Run tests
forge test
# Deploy (dry-run)
forge script script/Deploy.s.sol --rpc-url sepolia
# Deploy (broadcast)
forge script script/Deploy.s.sol --rpc-url sepolia --broadcast --verify
プロジェクト構成
my-project/
├── foundry.toml # Configuration
├── src/ # Contracts
│ └── Counter.sol
├── test/ # Tests (*.t.sol)
│ └── Counter.t.sol
├── script/ # Deploy scripts (*.s.sol)
│ └── Deploy.s.sol
└── lib/ # Dependencies
└── forge-std/
主なコマンド
ビルドとテスト
forge build # Compile
forge test # Run all tests
forge test -vvvv # With traces
forge test --match-test testDeposit # Filter by test name
forge test --match-contract Vault # Filter by contract
forge test --fork-url $RPC_URL # Fork testing
forge test --gas-report # Gas usage report
デプロイ
# Single contract
forge create src/Token.sol:Token --rpc-url sepolia --private-key $KEY --broadcast
# Script deployment (recommended)
forge script script/Deploy.s.sol:Deploy --rpc-url sepolia --broadcast --verify
# Verify existing contract
forge verify-contract $ADDRESS src/Token.sol:Token --chain sepolia
Cast - ブロックチェーンとのやり取り
cast call $CONTRACT "balanceOf(address)" $USER --rpc-url mainnet
cast send $CONTRACT "transfer(address,uint256)" $TO $AMOUNT --private-key $KEY
cast decode-tx $TX_HASH
cast storage $CONTRACT 0 --rpc-url mainnet
Anvil - ローカルノード
anvil # Start local node
anvil --fork-url $RPC_URL # Fork mainnet
anvil --fork-block-number 18000000
基本的なテストコントラクト
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
import {Test, console} from "forge-std/Test.sol";
import {Counter} from "../src/Counter.sol";
contract CounterTest is Test {
Counter public counter;
address public user;
function setUp() public {
counter = new Counter();
user = makeAddr("user");
deal(user, 10 ether);
}
function test_Increment() public {
counter.increment();
assertEq(counter.number(), 1);
}
function test_RevertWhen_Unauthorized() public {
vm.expectRevert("Unauthorized");
vm.prank(user);
counter.adminFunction();
}
function testFuzz_SetNumber(uint256 x) public {
x = bound(x, 0, 1000);
counter.setNumber(x);
assertEq(counter.number(), x);
}
}
主要なチートコード
// Identity & ETH
address alice = makeAddr("alice"); // Create labeled address
deal(alice, 10 ether); // Give ETH
deal(address(token), alice, 1000e18); // Give ERC20
// Impersonation
vm.prank(alice); // Next call as alice
vm.startPrank(alice); // All calls as alice
vm.stopPrank();
// Time & Block
vm.warp(block.timestamp + 1 days); // Set timestamp
vm.roll(block.number + 100); // Set block number
// Assertions
vm.expectRevert("Error message"); // Expect revert
vm.expectRevert(CustomError.selector); // Custom error
vm.expectEmit(true, true, false, true); // Expect event
emit Transfer(from, to, amount); // Must match next emit
// Storage
vm.store(addr, slot, value); // Write storage
vm.load(addr, slot); // Read storage
デプロイスクリプト
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
import {Script, console} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";
contract Deploy is Script {
function run() external {
uint256 deployerKey = vm.envUint("PRIVATE_KEY");
vm.startBroadcast(deployerKey);
Counter counter = new Counter();
counter.setNumber(42);
vm.stopBroadcast();
console.log("Deployed to:", address(counter));
}
}
最新の Solidity パターン(0.8.30)
// Custom errors (gas efficient)
error InsufficientBalance(uint256 available, uint256 required);
// Transient storage (0.8.28+) - cheap reentrancy guard
bool transient locked;
modifier nonReentrant() {
require(!locked, "Reentrancy");
locked = true;
_;
locked = false;
}
// Immutable variables (cheap reads)
address public immutable owner;
// Named mapping parameters
mapping(address user => uint256 balance) public balances;
// require with custom error (0.8.26+)
require(amount <= balance, InsufficientBalance(balance, amount));
設定(foundry.toml)
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc = "0.8.30"
optimizer = true
optimizer_runs = 200
evm_version = "prague"
fuzz.runs = 256
invariant.runs = 256
invariant.depth = 50
[rpc_endpoints]
mainnet = "${MAINNET_RPC_URL}"
sepolia = "${SEPOLIA_RPC_URL}"
[etherscan]
mainnet = { key = "${ETHERSCAN_API_KEY}" }
sepolia = { key = "${ETHERSCAN_API_KEY}" }
[profile.ci]
fuzz.runs = 10000
invariant.runs = 1000
参考資料
詳細なガイドについては、以下を参照してください。
- テスト:テストのパターン(ユニット、ファズ、インバリアント、フォーク)、すべてのチートコード、ベストプラクティスについては、
references/testing.mdを参照してください。 - forge-std API:ライブラリの完全なリファレンス(150 以上の関数)については、
references/forge-std-api.mdを参照してください。 - Solidity 0.8.30:新機能と最新の構文については、
references/solidity-modern.mdを参照してください。 - デプロイ:スクリプト作成、検証、マルチチェーンデプロイについては、
references/deployment.mdを参照してください。 - 設定:foundry.toml のすべてのオプションについては、
references/configuration.mdを参照してください。 - ガス最適化:ストレージパッキング、コンパイラー設定、プロファイリングについては、
references/gas-optimization.mdを参照してください。 - パターン:アクセス制御、リエントランシーガード、ファクトリー、一般的な慣用パターンについては、
references/patterns.mdを参照してください。 - セキュリティ:脆弱性、防御的なパターン、監査準備については、
references/security.mdを参照してください。 - リソース:公式ドキュメント、ライブラリ、セキュリティツール、学習パスについては、
references/resources.mdを参照してください。 - デバッグ:トレース、ブレークポイント、console.log、インタラクティブデバッガーについては、
references/debugging.mdを参照してください。 - 依存関係:forge install、リマッピング、Soldeer パッケージマネージャーについては、
references/dependencies.mdを参照してください。 - CI/CD:GitHub Actions ワークフロー、キャッシュ、ガス追跡については、
references/cicd.mdを参照してください。 - Chisel:インタラクティブな Solidity REPL については、
references/chisel.mdを参照してください。 - Cast 応用編:デコード、エンコード、ウォレット管理、バッチ処理については、
references/cast-advanced.mdを参照してください。 - Anvil 応用編:なりすまし、状態操作、マイニングモードについては、
references/anvil-advanced.mdを参照してください。
コメント
Markdown 対応