GTokenTool全网最好的代币发行工具平台
当前位置:首页 >> solana教程 >> Solana Dev 101 — 如何使用 Typescript 转移 Solana 代币

Solana Dev 101 — 如何使用 Typescript 转移 Solana 代币

admin solana教程 84

在 Solana 中,代币账户用于持有和管理代币,包括非同质化代币 (NFT)。这可能会让 Solana 的初级开发人员在用代码转移代币时遇到一些困难。在本教程中,我们将学习如何在 Solana 区块链上将 NFT 从一个钱包转移到另一个钱包。我们将通过为接收者创建一个新的关联代币账户 (ATA) 并将 NFT 转移到该账户来实现这一点。


新的 Solana TypeScript 框架:

简单地使用Kite进行 Solana 程序开发。


NFT 和 SOL 转移的区别

在代币转移中,需要创建一个新的关联代币账户 (ATA) 来启动从前所有者到新所有者的转移。这不会通过钱包 → 钱包转移进行。


这与涉及 SOL 的常规转移不同,因为系统程序将处理转移,并且不需要创建新的 ATA 来容纳交易中涉及的 SOL。


有关该过程的简要视觉表示,请参阅以下内容:

总而言之,在 NFT/Token 转移中,资产从当前 ATA 发送到接收者拥有的新创建的 ATA,而不是直接转移到钱包。


先决条件

在继续本教程之前,请确保您满足以下先决条件:


TypeScript 的基本知识。

您的机器上安装了Node.js。

已安装 npm 或 yarn 包管理器。

构建步骤

现在,让我们按照以下步骤构建代码:


1. 设置项目

为您的项目创建一个名为“Transfer”的新目录。

打开终端并导航到项目文件夹。

使用以下命令初始化一个新的 Node.js 项目:npm init -y或yarn init -y。

通过运行以下命令安装所需的依赖项:

代码

npm install @solana/web3.js @solana/spl-token bs58


创建一个新的 TypeScript 文件,例如transferNFT.ts,并在代码编辑器中打开它。

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. 为接收者生成相关的代币地址(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、密钥和用于传输的公钥。


结论

恭喜!您已成功构建代码以在 Solana 上转移 NFT,方法是创建一个新的关联代币帐户 (ATA) 并将 NFT 转移到接收者的帐户。通过学习本教程,您学习了如何在 Solana 区块链上建立连接、生成 ATA 和发送交易。您现在可以将此处学到的信息应用于您正在创建的任何 dApp 示例。

作者:GTokenTool一键发币平台

交流群:https://t.me/+Kz4u3xoDpFo3ZWY1

同类推荐