
【保存版】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の情報を取得しています。
ちなみに、下にあるように、「ethers」はプロパティのようです。
そして、ここにあるように、「getSigners()」は非同期で「SignerWithAddress[]」を取得するようです。
その上で、「deployer.address」でアドレスを、「deployer.getBalance()」メソッドでバランス(残高)を取得しています。
1ー2 ネットワークの確認
「hardhatArguments.network」には何が入っているのでしょう?
下のように確認してみました。
次のように表示され、「network」のプロパティに値が入っていることが確認できました。
1ー3 コントラクトのデプロイ
1ー3ー1 ContractFactoryの取得
下のように「ethers.getContractFactory("Asset")」でContractFactoryを取得しています。
では、「Asset」というコントラクトはどこにあるでしょうか?
solidityのファイル名は「コントラクト名.sol」とするのが基本ですので、「Asset.sol」に下のように含まれています。
「ethers.getContractFactory("Asset")」ではまず上のコントラクトを取ってきました。
1ー3ー2 IMXのコントラクトアドレスを取得する
次にImmutableXのコントラクトアドレスを取得します。
getIMXAddress()関数を使っています。
関数を使って取得しているのは、下のように用途に応じて、コントラクトアドレスが異なるためです。
今回は「Ropsten」のコントラクトアドレスが取得されています。
1ー3ー3 コントラクトのデプロイ
では、引数の準備ができたので、あとはデプロイしましょう。
3ー1で取得したContractFactoryを元にAsset.deploy()を実行しましょう。
下のように、このコントラクトには4つの引数が必要なため、下のように渡されています。
1ー3ー4 Verifyの実行
Verifyは「verify:verify」というサブタスクで実行します。
渡すものは、次の2つです。
①コントラクトアドレス
②コンストラクタで使う引数
これで、etherscanのverifyが実行されます。
2 ユーザー登録
2ー1 大まかな流れ
大まかな流れは次のようになります。
Step1 プロバイダの作成
Step2 ユーザー作成に必要な情報の取得
Step3 ユーザーの作成
⇨build()メソッドで作成
Step4 登録済みかの確認
⇨getUser()メソッドでアカウントの取得
Step5 未登録であれば、登録
⇨registerIMX()メソッドで登録
なお、Step1は次章以降も必要なステップになりますが、今後は省略していきます。
1 providerインスタンスの作成
ネットワークにつなげるためのProviderを作成しましょう。
「AlchemyProvider」クラスを用います。
必要なのは
① ネットワーク(ropsten,mainnetなど)
② AlchemyのAPIキー
2 プライベートキーを設定する
プライベートキーなどの、必要情報を取得していきましょう。
「requireEnvironmentVariable」関数を使ってprivateKeyを設定する。
requireEnvironmentVariable()関数は、下のように環境変数の値をvalueに入れて、返しています。
また、設定されていない場合はエラー表示を行います。
3 Userの作成
下のように「ImmutαbleXClient」クラスの「build」関数を使って、ユーザーを作成しています。
必要となるのは、次の7つ
① publicApiUrl
② signer
③ starkContractAddress
④ registrationContractAddress
⑤ gasLimit
⑥ gasPrice
⑦ enableDebug
このうち、②のsignerはウォレットをプロバイダーに接続して取得しています。(signer: new Wallet...のところ)
また、../config/clientを見ると、下のように5つ設定されています。
この外側の中括弧を3点リーダ(...)で外してImmutableXClient.build()に渡していました。
4 userアカウントの登録
userが登録済みかを確認します。
「ImmutableXClient」クラスの「getUser」メソッドを使って、アカウントを取得しています。
もし、getUserメソッドでアカウントが取得できない場合は未登録なので登録します。
「ImmutableXClient」クラスの「registerIMX」メソッドを使って、下のように登録します。
登録には、次の2つが必要です。
①etherKey
②starkPublicKey
これで登録が完了しました。
5 コンソールへの出力
コンソールの出力は下のように「ImLogger」クラスの「info」メソッドが使われています。
下のように「message」が最初に出て、その後に「component」と「extra」が出力されています。
3 プロジェクトの作成
3ー0 大まかな流れ
大まかな流れは、次のようになります。
Step1 プロジェクト作成に必要なパラメータの取得
⇨「CreateProjectParams」に格納する
Step2 Step1を用いてプロジェクトの作成
⇨「createProject()メソッド」を実行する
3ー1 CreateProjectParamsタイプの使用
プロジェクト作成用のパラメータをセットにしたタイプがあるので、これを使用します。
3ー2 パラメータの設定
下のようにプロジェクト作成に必要となるパラメータを設定します。
3ー3 プロジェクトの作成
「ImmutableXClient」クラスの「createProject」メソッドを使ってプロジェクトを作成します。
戻り値としてはプロジェクトIDが返ってきます。
3ー4 コンソールを見てみよう
下のようにプロジェクトが作成され、プロジェクトIDが返ってきていることがわかります。
今回はプロジェクトIDは10,828でした。
4 コレクションの作成
4ー0 大まかな流れ
大まかな流れは、次のようになります。
Step1 コレクション作成に必要なパラメータの取得
⇨「CreateCollectionParams」に格納する
Step2 Step1を用いてコレクションの作成
⇨「createCollection()メソッド」を実行する
4ー1 コレクション作成用Type
コレクション作成用のタイプとして「CreateCollectionParams」があります。
このように8つのパラメータが入っています。
4ー2 コレクション用のコントラクトアドレスの設定
第1章で作成したコントラクトアドレスを設定することになります。
また、コレクションはプロジェクトに紐づくため、前章で作成したプロジェクトのプロジェクトIDも下のように使うこととなります。
4ー3 「CreateCollectionParams」へのパラメータの設定
下のようにコレクションを作成するために必要となる8つのパラメータを入れていきます。
なお、「metadata_api_url」はいわゆるメタデータで、NFTの画像情報やdescriptionの情報を紐づけるものになります。
4ー4 コレクションの作成
ImmutableXClientクラスのcreateCollection()メソッドを使ってコレクションを作成します。
実行してみると、下のように成功したことがわかります。
5 ミントの実行
5ー0 大まかな流れ
大まかな流れは、次のようになります。
Step1 ミント情報の取得(ミント先など)
⇨コマンドのオプションからの取得
Step2 ミントを行うTokenの格納
Step3 ミント時に必要なパラメータの取得
⇨「ImmutableOffchainMintV2ParamsTs」に格納する
Step4 ミントの実行
⇨「mintV2()メソッド」を実行する
5ー1 コマンドのオプション確認
ミントのコマンドには下のように二つのオプションがあります。
・-nオプション(個数)
・-wオプション(ウォレット)
5ー2 オプションの格納
下のように、オプションに応じて「wallet」「number」オプションにそれぞれ格納しています。
これにより、いくつ、どのウォレットにミントを行うのかをオプションで指定することができます。
5ー3 ミントを行うトークンの格納
下のように、mapメソッドを使って、tokensにミントをする情報を格納します。
「number」を用いているので、指定した数だけ格納します。
なお、tokensの中身を見ると、下のようになっています。
5ー4 ミント実行用Typeへのパラメータ格納
下のように「ImmutableMethodParams.ImmutableOffchainMintV2ParamsTs」というtypeを用います。
大まかな構成としては、次のようになります。
①users (ユーザー)
1)etherKey(ミント先ウォレットアドレス)
2)tokens(ミントするトークン情報)
②contractAddress(コントラクトアドレス)
5ー5 ミントの実行
ImmutableXClientクラスのmintV2()メソッドでミントを実行します。
ミントに必要な情報は5ー4で取得したので、それを渡すだけです。
5ー6 ミントの結果の確認
下のように、ミントの結果が出てきます。
ミントを行ったことにより、「tx_id」を取得しています。
今回は以上です。
最後までお読みいただき、ありがとうございました。
いいなと思ったら応援しよう!
