見出し画像

Foundryを実行して、テストネットにデプロイと検証してみる

Foundryとは

Foundryは、スマートコントラクトを開発、テスト、およびデプロイするための統合フレームワークです。

Rustで開発されているため、コンパイルやテストの実行速度が速いです。

テストコードをSolidityで書けたり、コマンドラインからデプロイや検証ができます。

Hardhatだと、デプロイやテストコードをJavaScriptかTypeScriptで書く必要があります。
ただしドキュメントは、Hardhatが多い印象です。

Foundryのセットアップ

Macのターミナルで、CLIを使うためFoundryupをインストールします。
Windowsや他の環境でのセットアップは、公式ドキュメントをご確認ください。

curl -L https://foundry.paradigm.xyz | bash
foundryup


プロジェクトを作成します。

forge init hello_foundry


作成したプロジェクトに移動します。

cd hello_foundry/


次のコマンドで、プロジェクトをビルドできます。

forge build

[⠒] Compiling...
[⠆] Compiling 27 files with Solc 0.8.28
[⠔] Solc 0.8.28 finished in 2.21s
Compiler run successful!


テストコマンドで、テストできます。

forge test

[] Compiling...
No files changed, compilation skipped

Ran 2 tests for test/Counter.t.sol:CounterTest
[PASS] testFuzz_SetNumber(uint256) (runs: 256, μ: 31054, ~: 31288)
[PASS] test_Increment() (gas: 31303)
Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 33.35ms (24.15ms CPU time)

Ran 1 test suite in 475.13ms (33.35ms CPU time): 2 tests passed, 0 failed, 0 skipped (2 total tests)


ビルドするとoutとcacheのフォルダーが出力されます。
outは、フロントエンドでコントラクトを実行するためのABIが含まれます。

cacheは、再ビルドしたときに変更したモジュールを再コンパイルするフォルダーです。

Foundryを実行してみる

プロジェクトのルートディレクトリで、VSCodeを開きます。

code .


コントラクトの開発は、srcフォルダー内に記述します。


// Counter.sol

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

contract Counter {
    // 数値型で外部からアクセスできる変数を定義
    uint256 public number;

    // 引数で受け取った値を変数に格納
    function setNumber(uint256 newNumber) public {
        number = newNumber;
    }

    // 変数に1を足していく
    function increment() public {
        number++;
    }
}


テストコードは、testフォルダー内に記述します。
ファイル名は、Counter.t.solのようにコントラクト名にt.solをつけます。


// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Test, console} from "forge-std/Test.sol";
import {Counter} from "../src/Counter.sol";

contract CounterTest is Test {
    Counter public counter;

    // 変数を0で初期化
    function setUp() public {
        counter = new Counter();
        counter.setNumber(0);
    }

    // 変数に1を足して、成功するか
    function test_Increment() public {
        counter.increment();
        assertEq(counter.number(), 1);
    }

    // 引数の値を更新できるか
    function testFuzz_SetNumber(uint256 x) public {
        counter.setNumber(x);
        assertEq(counter.number(), x);
    }
}


–match-contract を付けると指定したコントラクトをテストできます。

forge test --match-contract Counter


さらに--match-testを付けるとコントラクト内の特定の関数をテストできます。

forge test --match-contract Counter --match-test test_Increment


ガス代を含めた細かいテストもできます。

forge test -vvvvv


最後にイーサリアムのテストネットにデプロイします。
RPC-URLとメタマスクの秘密鍵が必要です。

forge create --rpc-url <your_rpc_url> --private-key <your_private_key> src/Counter.sol:Counter
[] Compiling...
No files changed, compilation skipped
Deployer: 0x9eDA810A110E2f84462326F9Cbe3996afdE29ea8
Deployed to: 0xF363FBF764f30C8347402667B499Ef525fA3AcB0
Transaction hash: 0xc1ecda06dc8bfc507fb13e4fa14d0d402f83a669ac915d7a2f6de22d4f889e73


RPC-URLは、Alchemyから取得できます。


Sepoliaに変えて、コピーしてコマンドに貼り付けます。


コントラクトに引数がある場合は、--constructor-argsを加えます。

forge create --rpc-url <your_rpc_url> --private-key <your_private_key> src/Counter.sol:Counter --constructor-args "HOGE" "HUGA" 18


最後に--verifyをつけて検証します。
etherscanのapiキーが必要になります。

forge create --rpc-url <your_rpc_url> \
    --private-key <your_private_key> \
    --etherscan-api-key <your_etherscan_api_key> \
    --verify \
    src/Counter.sol:Counter


コントラクトのデプロイと検証まで出来ました!

https://sepolia.etherscan.io/address/0xF363FBF764f30C8347402667B499Ef525fA3AcB0


この記事が気に入ったらサポートをしてみませんか?