Solana Bootcamp③ メタデータ付きトークンの作成
1 実行方法について
実行方法はこちらのnoteのやり方と同じです。
こちらの「3.createTokenWithMetadata.ts」を実行するだけです。
2 概要
今回の概要は、「メタデータ付きのトークンの作成」です。
大きなステップとしては、
から構成されています。
3 トークンミントアカウントの作成
1 アカウントの作成
まずは、トークンの必要最低限の設定を保持するためのアカウントを作ります。
アカウントを作るときの方法は、いつも通り、「SystemProgram.createAccount」を使っています。
2 スペースの設定
アカウントに必要なスペースを設定します。
これは、トークンの内容や権限のある者、残高などを保持する必要があるためです。
具体的には、「MintLayout」のスペースを確保しています。
3 レント免除分のLamports
レント免除分のLamportsについては、スペースのサイズに応じて決定しています。
4 プログラムID
トークンアカウントのプログラムIDは、「TokenProgram」のIDになります。
前回のアカウントは、「SystemProgram」のIDでした。
なお、TokenProgramは、こちらになります。
具体的には、こちらになります。
4 トークンミントの初期化
トークンミントの初期化とは、トークンの基本的な属性を設定するプロセスです。
1 メソッドについて
これは、「createInitializedMint2Instruction」メソッドを使用しています。
これは、「@solana/spl-token」からインポートしています。
2 引数について
引数は、下のように、設定しています。
①トークンミントアカウントの公開鍵
②Decimals(ブロックチェーンでよく出てくる、小数点以下の桁数)
③ミント権限の公開鍵
④フリーズ権限の公開鍵
5 PDAの抽出
1 概要
「PublicKey.findProgramAddressSync」を用いて、メタデータ用のアカウントを抽出しています。
PDA(プログラム派生アドレス)を使用しています。
なお、PDAの詳細については、こちらの記事もご参照ください。
なお、ここで使われている、「PublicKey」は「@solana/web3.js」からインポートしています。
2 引数① シードについて
PDAには「シード」と「プログラムID」が必要です。
今回のシードは、下の3つから構成されているようです。
これにより、シードが一意であり、再現可能であることを保証しています。
3 引数② プログラムID
引数には、「METADATA_PROGRAM_ID」を指定しています。
これは、「@metaplex-foundation/mpl-token-metadata」からインポートした、「PROGRAM_ID」であることがわかります。
より具体的には、このようになっています。
具体的には、こちらがそのプログラムです。
つまり、今回はこのようになっています。
ちなみに、後ほど抽出したPDAを見てみると、所有者が「Metaplex Token Metadata」になっていることも確認できます。
6 メタデータアカウントの設定
1 メソッドについて
メソッドは、「createCreateMetadataAccountV3Instruction」を使っています。
引数としては、大まかに2つをとっていることがわかります。
ちなみに、こちらは「@metaplex-foundation/mpl-token-metadata」からインポートしています。
2 引数① アカウントの設定
一つ目の引数群としては、アカウントの設定を行っています。
メタデータや、それに紐づけるミントアカウント、権限のあるアカウントなどを下のように紐づけています。
3 引数③ メタデータ情報
メタデータの情報として、大きく、次の3つを設定しています。
大まかには、こちらの3つを設定しています。
さらに、dataの詳細はこちらです。
詳細は省きますが、これらの内容は、chatGPTなどでも出てきます。
ちなみに、これらの詳細については、
この辺りで設定していました。
7 トランザクションの構築について
トランザクションの構築は「buildTransaction」を使用しています。
これは、前回までと違っていますね。
ただ、中身を見てみると、前回までと同じであることがわかります。
そのため、詳細は省きます。
8 try-catch文について
ここも前回と異なり、try-catch文を使っています。
より実務的になりましたね。
トランザクションをブロックチェーンに送り、その結果に応じて、分岐させています。
成功した場合は、publicKeyを下のように、ファイルに保存しています。
失敗した場合は、「extractSignatureFromFailedTransaction」メソッドを実行しているようです。
これによって、署名を抽出できるので、エラーを確認することができます。
「extractSignatureFromFailedTransaction」メソッドは、ヘルパー関数なので、詳細は省きます。
ただ、今回は、「fetchLogs」は引数に設定していないので、署名だけを抽出したいのだとわかります。
今回は以上です。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊