見出し画像

【保存版】ImmutableXのコントラクトの作成からミントまでをコードで確認しましょう。

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

クリスペの会社です。

またCryptoMaidsのアンバサダーも務めております。

今回は下の記事の続きです。

上の記事でImmutableXのコントラクトの作成からミントまでができるようになります。

今回の記事は上の記事の第2章から行っているものの実際のコードを確認します。

コードを確認することで、理解がさらに深まれば幸いです。

では、やっていきましょう。

1 コントラクトのデプロイ

1ー0 大まかな流れ

まずはコントラクトのデプロイにどのような流れがあるのかを見てみましょう。

Step1 Signer(署名者)の取得
Step2 ネットワーク情報の取得
Step3 コントラクトの実行
 1) コントラクトの指定
   ⇨getContractFactory()メソッド
の実行
 2) コントラクトに渡す情報の取得
   ⇨getIMXAddress()メソッドなど
 3) コントラクトのデプロイ
   ⇨deploy()メソッドの実行
 4) コントラクトのverify
   ⇨
「verify:verify」サブタスクの実行

Step1 Signer(署名者)の取得
⇨コントラクトのデプロイにサインする人がいないと実行できませんね。

Step2 ネットワーク情報の取得
⇨どのネットワーク(mainnet? Ropsten? Polygon?)かがわからないとデプロイできませんね。

Step3 コントラクトの実行
 1) コントラクトの指定
 
  ⇨ どのコントラクトをデプロイするか指定しましょう。
 2) コントラクトに渡す情報の取得
   ⇨ コントラクトに渡す値があれば取得しましょう。
 3) コントラクトのデプロイ
   ⇨デプロイしましょう。
 4) コントラクトのverify
   ⇨verify(検証)しましょう。

1ー1 signerの取得

まずは、下のように「ethers.getSigners()」でsingerの情報を取得しています。

スクリーンショット 2022-02-06 9.26.52

ちなみに、下にあるように、「ethers」はプロパティのようです。

スクリーンショット 2022-02-06 9.36.44

そして、ここにあるように、「getSigners()」は非同期で「SignerWithAddress[]」を取得するようです。

その上で、「deployer.address」でアドレスを、「deployer.getBalance()」メソッドでバランス(残高)を取得しています。

1ー2 ネットワークの確認

「hardhatArguments.network」には何が入っているのでしょう?

下のように確認してみました。

スクリーンショット 2022-02-06 13.52.32

次のように表示され、「network」のプロパティに値が入っていることが確認できました。

スクリーンショット 2022-02-06 13.52.44

1ー3 コントラクトのデプロイ

1ー3ー1 ContractFactoryの取得

下のように「ethers.getContractFactory("Asset")」でContractFactoryを取得しています。

スクリーンショット 2022-02-06 13.56.49

では、「Asset」というコントラクトはどこにあるでしょうか?

solidityのファイル名は「コントラクト名.sol」とするのが基本ですので、「Asset.sol」に下のように含まれています。

スクリーンショット 2022-02-06 14.02.47

「ethers.getContractFactory("Asset")」ではまず上のコントラクトを取ってきました。

1ー3ー2 IMXのコントラクトアドレスを取得する

次にImmutableXのコントラクトアドレスを取得します。

getIMXAddress()関数を使っています。

スクリーンショット 2022-02-06 14.09.11

関数を使って取得しているのは、下のように用途に応じて、コントラクトアドレスが異なるためです。

スクリーンショット 2022-02-06 14.07.14

今回は「Ropsten」のコントラクトアドレスが取得されています。

1ー3ー3 コントラクトのデプロイ

では、引数の準備ができたので、あとはデプロイしましょう。

3ー1で取得したContractFactoryを元にAsset.deploy()を実行しましょう。

スクリーンショット 2022-02-06 14.13.07

下のように、このコントラクトには4つの引数が必要なため、下のように渡されています。

スクリーンショット 2022-02-06 14.02.47

1ー3ー4 Verifyの実行

Verifyは「verify:verify」というサブタスクで実行します。

渡すものは、次の2つです。
①コントラクトアドレス
②コンストラクタで使う引数

スクリーンショット 2022-02-06 14.23.44

これで、etherscanのverifyが実行されます。

2 ユーザー登録

2ー1 大まかな流れ

大まかな流れは次のようになります。

Step1 プロバイダの作成
Step2 ユーザー作成に必要な情報の取得
Step3 ユーザーの作成
   ⇨build()メソッド
で作成
Step4 登録済みかの確認
   ⇨getUser()メソッドでアカウントの取得
Step5 未登録であれば、登録
   ⇨registerIMX()メソッドで登録

なお、Step1は次章以降も必要なステップになりますが、今後は省略していきます。

1  providerインスタンスの作成

ネットワークにつなげるためのProviderを作成しましょう。

「AlchemyProvider」クラスを用います。

必要なのは
① ネットワーク(ropsten,mainnetなど)
② AlchemyのAPIキー

スクリーンショット 2022-02-06 7.06.35

2 プライベートキーを設定する

プライベートキーなどの、必要情報を取得していきましょう。

「requireEnvironmentVariable」関数を使ってprivateKeyを設定する。

スクリーンショット 2022-02-06 7.15.53

requireEnvironmentVariable()関数は、下のように環境変数の値をvalueに入れて、返しています。

また、設定されていない場合はエラー表示を行います。

スクリーンショット 2022-02-06 7.17.23

3 Userの作成

下のように「ImmutαbleXClient」クラスの「build」関数を使って、ユーザーを作成しています。

スクリーンショット 2022-02-06 7.31.17

必要となるのは、次の7つ
① publicApiUrl
② signer
③ starkContractAddress
④ registrationContractAddress
⑤ gasLimit
⑥ gasPrice
⑦ enableDebug

このうち、②のsignerウォレットプロバイダーに接続して取得しています。(signer: new Wallet...のところ)

また、../config/clientを見ると、下のように5つ設定されています。

スクリーンショット 2022-02-06 7.39.27

この外側の中括弧を3点リーダ(...)で外してImmutableXClient.build()に渡していました。

4 userアカウントの登録

userが登録済みかを確認します。

「ImmutableXClient」クラスの「getUser」メソッドを使って、アカウントを取得しています。

スクリーンショット 2022-02-06 7.46.57

もし、getUserメソッドでアカウントが取得できない場合未登録なので登録します。

「ImmutableXClient」クラスの「registerIMX」メソッドを使って、下のように登録します。

スクリーンショット 2022-02-06 7.55.22

登録には、次の2つが必要です。
①etherKey
②starkPublicKey

これで登録が完了しました。

5 コンソールへの出力

コンソールの出力は下のように「ImLogger」クラスの「info」メソッドが使われています。

スクリーンショット 2022-02-06 8.33.00

下のように「message」が最初に出て、その後に「component」「extra」が出力されています。

スクリーンショット 2022-02-06 8.31.30


3 プロジェクトの作成

3ー0 大まかな流れ

大まかな流れは、次のようになります。

Step1 プロジェクト作成に必要なパラメータの取得
   ⇨「CreateProjectParams」
に格納する
Step2 Step1を用いてプロジェクトの作成
   ⇨
「createProject()メソッド」を実行する

3ー1 CreateProjectParamsタイプの使用

プロジェクト作成用のパラメータをセットにしたタイプがあるので、これを使用します。

スクリーンショット 2022-02-06 8.51.47

3ー2 パラメータの設定

下のようにプロジェクト作成に必要となるパラメータを設定します。

スクリーンショット 2022-02-06 8.52.08

3ー3 プロジェクトの作成

「ImmutableXClient」クラスの「createProject」メソッドを使ってプロジェクトを作成します。

戻り値としてはプロジェクトIDが返ってきます。

スクリーンショット 2022-02-06 8.56.43

3ー4 コンソールを見てみよう

下のようにプロジェクトが作成され、プロジェクトIDが返ってきていることがわかります。

スクリーンショット 2022-02-06 8.59.23

今回はプロジェクトIDは10,828でした。

4 コレクションの作成

4ー0 大まかな流れ

大まかな流れは、次のようになります。

Step1 コレクション作成に必要なパラメータの取得
   ⇨
「CreateCollectionParams」に格納する
Step2 Step1を用いてコレクションの作成
   ⇨「
createCollection()メソッド」を実行する

4ー1 コレクション作成用Type

コレクション作成用のタイプとして「CreateCollectionParams」があります。

このように8つのパラメータが入っています。

スクリーンショット 2022-02-06 14.39.50

4ー2 コレクション用のコントラクトアドレスの設定

第1章で作成したコントラクトアドレスを設定することになります。

また、コレクションはプロジェクトに紐づくため、前章で作成したプロジェクトのプロジェクトIDも下のように使うこととなります。

スクリーンショット 2022-02-06 14.43.56

4ー3 「CreateCollectionParams」へのパラメータの設定

下のようにコレクションを作成するために必要となる8つのパラメータを入れていきます。

なお、「metadata_api_url」はいわゆるメタデータで、NFTの画像情報やdescriptionの情報を紐づけるものになります。

スクリーンショット 2022-02-06 14.48.21

4ー4 コレクションの作成

ImmutableXClientクラスcreateCollection()メソッドを使ってコレクションを作成します。

スクリーンショット 2022-02-06 14.48.58

実行してみると、下のように成功したことがわかります。

スクリーンショット 2022-02-06 14.52.46

5 ミントの実行

5ー0 大まかな流れ

大まかな流れは、次のようになります。

Step1 ミント情報の取得(ミント先など)
⇨コマンドのオプションからの取得
Step2 ミントを行うTokenの格納
Step3 ミント時に必要なパラメータの取得
ImmutableOffchainMintV2ParamsTsに格納する
Step4 ミントの実行
⇨「
mintV2()メソッドを実行する

5ー1 コマンドのオプション確認

ミントのコマンドには下のように二つのオプションがあります。

・-nオプション(個数)
・-wオプション(ウォレット)

スクリーンショット 2022-02-06 18.00.59

5ー2 オプションの格納

下のように、オプションに応じて「wallet」「number」オプションにそれぞれ格納しています。

スクリーンショット 2022-02-06 15.54.36

これにより、いくつ、どのウォレットにミントを行うのかをオプションで指定することができます。

5ー3 ミントを行うトークンの格納

下のように、mapメソッドを使って、tokensにミントをする情報を格納します。

「number」を用いているので、指定した数だけ格納します。

スクリーンショット 2022-02-06 16.02.02

なお、tokensの中身を見ると、下のようになっています。

スクリーンショット 2022-02-06 18.10.41

5ー4 ミント実行用Typeへのパラメータ格納

下のように「ImmutableMethodParams.ImmutableOffchainMintV2ParamsTs」というtypeを用います。

スクリーンショット 2022-02-06 16.11.34

大まかな構成としては、次のようになります。
①users (ユーザー)
 1)etherKey(ミント先ウォレットアドレス)
 2)tokens(ミントするトークン情報)
②contractAddress(コントラクトアドレス)

5ー5 ミントの実行

ImmutableXClientクラスmintV2()メソッドでミントを実行します。

ミントに必要な情報は5ー4で取得したので、それを渡すだけです。

スクリーンショット 2022-02-06 17.54.15

5ー6 ミントの結果の確認

下のように、ミントの結果が出てきます。

スクリーンショット 2022-02-06 18.20.59

ミントを行ったことにより、「tx_id」を取得しています。


今回は以上です。

最後までお読みいただき、ありがとうございました。


サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊