mcpField
F
foundry-solidity

foundry-solidity

github.com/tenequm開発40161 回インストール5 日前に更新
リポジトリ

foundry-solidity について

foundry-solidityは、FoundryとSolidityによるEthereumおよびEVMスマートコントラクトの開発・テスト向けスキルです。Forgeテスト、デプロイ、チェーン操作、デバッグ、安全性、設定を扱います。

主な機能

  1. 01コントラクトのビルドとテスト手順
  2. 02ユニット、ファズ、不変条件、フォークテスト
  3. 03スクリプトによるデプロイと検証
  4. 04castによるチェーン呼び出しとトランザクション解析
  5. 05anvilによるローカル・フォークネットワーク
  6. 06セキュリティ、デバッグ、ガスの指針

活用シーン

  1. 01EthereumまたはEVMコントラクトの開発
  2. 02コントラクトの動作とガス使用量のテスト
  3. 03コントラクトのデプロイと検証
  4. 04トランザクションやコントラクト操作のデバッグ

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/tenequm/skills --skill foundry-solidity

インストール後、Claude Code で/foundry-solidityを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE.txt
references/
anvil-advanced.md
cast-advanced.md
chisel.md
cicd.md
configuration.md
debugging.md
dependencies.md
deployment.md
forge-std-api.md
gas-optimization.md
patterns.md
resources.md
security.md
solidity-modern.md
testing.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 を参照してください。

コメント