
Solana Dev 101 — TypeScriptでSolanaトークンを転送する方法
Solanaでは、非代替性トークン(NFT)を含むトークンの保有と管理にトークンアカウントを使用します。そのため、Solanaの初心者開発者にとって、コードによるトークン転送は少し難しく感じられる場合があります。このチュートリアルでは、Solanaブロックチェーン上で、あるウォレットから別のウォレットへNFTを転送する方法を学びます。受取人用に新しいAssociated Token Account(ATA)を作成し、そのアカウントへNFTを転送します。
KiteでSolanaプログラム開発をシンプルにできます。
NFTとSOLの転送の違い
トークン転送では、以前の所有者から新しい所有者への転送を開始するために、新しいAssociated Token Account(ATA)を作成する必要があります。ウォレットからウォレットへ直接転送するわけではありません。
これは通常のSOL転送とは異なります。SOLの転送はシステムプログラムが処理するため、トランザクションに含まれるSOLを保管する新しいATAを作成する必要はありません。
処理の流れを簡単に図示したものを以下に示します。
まとめると、NFT/トークンの転送では、資産をウォレットへ直接転送するのではなく、現在のATAから受取人が所有する新しく作成されたATAへ送信します。
前提条件
このチュートリアルを進める前に、以下の前提条件を満たしていることを確認してください。
- TypeScriptの基礎知識があること。
- マシンにNode.jsがインストールされていること。
- npmまたはyarnパッケージマネージャーがインストールされていること。
実装手順
それでは、以下の手順に沿ってコードを実装します。
1. プロジェクトをセットアップする
- 「Transfer」という名前で、プロジェクト用の新しいディレクトリを作成します。
- ターミナルを開き、プロジェクトフォルダーへ移動します。
npm init -yまたはyarn init -yコマンドを使用して、新しいNode.jsプロジェクトを初期化します。- 次のコマンドを実行して、必要な依存関係をインストールします。
npm install @solana/web3.js @solana/spl-token bs58- transferNFT.tsなどの新しいTypeScriptファイルを作成し、コードエディターで開きます。
2. ライブラリをインポートする
必要なライブラリをインポートし、新しいtransferNFT.tsファイルで転送関数を定義します。
import { Keypair, Transaction, Connection, PublicKey } from "@solana/web3.js";
import { createTransferCheckedInstruction, getAssociatedTokenAddress } from "@solana/spl-token";
import * as bs58 from "bs58";
async function transfer() {
// Code for transferring NFTs goes here
}
transfer();上記のコードでは、必要なパッケージをインポートし、転送関数を作成しています。
3. Solanaネットワークへの接続を確立する
const connection = new Connection("https://rpc.helius.xyz/?api-key=");上記のコードでは、Helius RPCを使用してSolanaブロックチェーンへの接続を確立しています。
4. 手数料支払者と以前の所有者のキーペアを定義する
const feePayer = Keypair.fromSecretKey(bs58.decode("privateKey"));
const prevOwner = Keypair.fromSecretKey(bs58.decode("privateKey"));5. ミント公開鍵と受取人のウォレットアドレスを指定する
ミント公開鍵には、転送するNFTのトークンアドレスを指定します。
const mintPubkey = new PublicKey("4umMdShNxbdnoV2EZjUp6h5GYYneZFLH9otBEU2K3ZYP");
const receiveAddress = new PublicKey("2xSHLfiPs3aEhzbLnYbyzWYMEaYnwSwJwAnVh5CwHWwX");6. 受取人のAssociated Token Address(ATA)を生成する
const ata = await getAssociatedTokenAddress(mintPubkey, receiveAddress);このコードでは、新しいATAの所有者として、別のアドレスの公開鍵を設定しています。この所有者は、トランザクションの支払者である必要はありません。
receiveAddressには、資産の転送先となるアドレスを必ず設定してください。
7. 転送元トークンアカウントと転送先アカウントの公開鍵を指定する
const tokenAccount1Pubkey = new PublicKey("CE2uTSeVbBhy2Q8qVEnp8qAJYBQkVxMC4uGzchiAn6gG");
const tokenAccount2Pubkey = new PublicKey(ata);8. 新しいトランザクションを作成し、転送命令を追加する
const tx = new Transaction();
tx.add(
createTransferCheckedInstruction(
tokenAccount1Pubkey,
mintPubkey,
tokenAccount2Pubkey,
prevOwner.publicKey,
1, // Amount you are transferring.
0 // Decimals, since this is an NFT you can leave 0.
)
);上記のコードでは、以下を行っています。
- 以前のトークンアカウントと現在のトークンアカウントを定義します。
- ミントアドレスの供給量は1しかないため、転送量を1に設定します。
- 非代替性トークンの標準に準拠するため、小数点以下の桁数を0に設定します。代替性トークンの場合は、転送用に小数点以下の桁数を適切に設定できます。
9. トランザクションをSolanaネットワークへ送信する
const txhash = await connection.sendTransaction(tx, [feePayer, prevOwner]);
console.log(`Transaction hash: ${txhash}`);ここではsendTransactionメソッドを使用してトランザクションを完了し、手数料支払者と資産の以前の所有者を署名者として指定しています。
完成したコード
import { Keypair, Transaction, Connection, PublicKey } from "@solana/web3.js";
import { createTransferCheckedInstruction, getAssociatedTokenAddress } from "@solana/spl-token";
import * as bs58 from "bs58";
async function transfer() {
// connection to Solana.
const connection = new Connection("https://rpc.helius.xyz/?api-key=");
// Payer of new ATA.
const feePayer = Keypair.fromSecretKey(
bs58.decode("privateKey")
);
// Previous owner of Token or NFT
const prevOwner = Keypair.fromSecretKey(
bs58.decode("privateKey")
);
// Mint address of the NFT.
const mintPubkey = new PublicKey("4umMdShNxbdnoV2EZjUp6h5GYYneZFLH9otBEU2K3ZYP");
// Recipient of the NFT.
const receiveAdress = new PublicKey('2xSHLfiPs3aEhzbLnYbyzWYMEaYnwSwJwAnVh5CwHWwX')
// Original Token Account
const tokenAccount1Pubkey = new PublicKey("CE2uTSeVbBhy2Q8qVEnp8qAJYBQkVxMC4uGzchiAn6gG");
let ata = await getAssociatedTokenAddress(
mintPubkey, // mint
receiveAdress // owner
);
// Create transfer instruction to from the previous ATA owned by old wallet, to new ATA.
const tokenAccount2Pubkey = new PublicKey(ata);
let tx = new Transaction();
tx.add(
createTransferCheckedInstruction(
tokenAccount1Pubkey, // from
mintPubkey, // mint
tokenAccount2Pubkey, // to
prevOwner.publicKey, // from's owner
1, // amount
0 // decimals
)
);
// Send Transaction here.
console.log(`txhash: ${await connection.sendTransaction(tx, [feePayer, prevOwner])}`);
}
transfer()コード内のプレースホルダー値は、RPC URL、秘密鍵、転送用の公開鍵など、実際の値に置き換えてください。
まとめ
お疲れさまでした。新しいAssociated Token Account(ATA)を作成し、NFTを受取人のアカウントへ転送することで、Solana上でNFTを転送するコードを実装できました。このチュートリアルでは、接続を確立し、ATAを生成し、Solanaブロックチェーン上でトランザクションを送信する方法を学びました。ここで得た知識を、作成するあらゆるdAppに応用できます。
関連記事
Heliusを購読
Solana開発の最新情報や新しい記事の公開通知を受け取れます


