📖

Forgeを使ってコントラクトを作成し、thirdwebにデプロイしよう

2022/12/01に公開

こんにちは、CryptoGamesの高橋です。

本日は、こちらの記事を元に、Forgeを使ってコントラクトを作成し、thirdweb上にデプロイしていきたいと思います。
https://blog.thirdweb.com/guides/get-started-with-forge-and-thirdweb/

1.Foundryをインストールする

まずは、Foundryを公式からインストールしてみましょう。
https://book.getfoundry.sh/getting-started/installation

環境によって、方法が異なるのでここでは詳細は省略します。

Foundryをインストールすると、①forge②cast③anvilが使用できるようになります。

○LinuxとMacOS

○Windows

2.thirdwebでForge用のコントラクトのテンプレートを用意する

こちらのコマンドを実行します。

npx thirdweb@latest create contract

その後、下のようにして、Forgeをアップデートします。

forge clean && foundryup && forge update

3.コントラクトを見てみましょう

では、コントラクトを見ていきましょう。

下のコードを追加します。
このミントの関数について、テストを行っていきます。

function mint(address _to, uint256 _amount) external {
    require(_amount > 0, 'You must mint at least one token!');
    _safeMint(_to, _amount);
}

では、テスト用のコントラクトも見てみましょう。

ポイントは「Contract.t.sol」と書かれているように、solidityでコントラクトとして書かれている点だと思います。

コードもこちらに貼り付けておきます。

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

import "forge-std/Test.sol";
import "../src/Contract.sol";

contract ContractTest is Test {
    Contract drop;
    address testAddr = makeAddr("Test");

    function setUp() public {
        drop = new Contract("MintTest", "MT", testAddr, 500, testAddr);
    }

    function testDropWithZeroTokens() public{
        vm.expectRevert(bytes("You must mint at least one token!"));
        drop.mint(testAddr, 0);
        assertEq(drop.balanceOf(testAddr), 0);
    }
    function testDropWithTokensMinted() public{
        drop.mint(testAddr, 2);
        assertEq(drop.balanceOf(testAddr), 2);
    }
}

まずは、こちらのmakeAddr関数を見てみましょう。

こちらの公式ページに詳細があります。
https://book.getfoundry.sh/reference/forge-std/make-addr?highlight=makeAdd#makeaddr

下のように、アドレスを作成しています。

次に、下のようにdropにコントラクトのインスタンスを入れて、vm.expertRevert関数を使っています。

今回は、vm.expertRevertの次の行のmint関数がエラーになることを想定しています。(0個ミントしようとしており、コントラクトでrequireで設定している)

その時に、表示されるエラーメッセージが想定通りかどうかを確かめることができます。

詳細はこちらの公式になります。
https://book.getfoundry.sh/cheatcodes/expect-revert?highlight=expectRe#expectrevert

下のように、エラーメッセージを渡しています。

こちらでは、assertEq関数を使っています。

二つの引数が等しいかどうかを確認しています。

詳細はこちらの公式になります。
https://book.getfoundry.sh/reference/forge-std/assertEq?highlight=assertEq#asserteq

下のように、aとbが等しいかどうかを確認しています。

4.テストを実行する

確認ができましたら、次のコマンドで、テストを行ってみましょう。

forge test

うまくいったようです。

5.thirdwebにデプロイする

最後に、次のようにして、thirdwebにデプロイしてみましょう。

npx thirdweb@latest deploy

すると、次のように、thirdwebが立ち上がります。

必要事項を入力し、「Deploy Now」でデプロイができます。

今回は以上です。

ぜひやってみてください。

Discussion