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
この記事が気に入ったらサポートをしてみませんか?