如何使用 TypeScript 转移 Solana 代币

  • Helius
  • 发布于 2023-07-26 17:18
  • 阅读 104

本文讲解了如何使用TypeScript在Solana区块链上转移NFT。重点包括创建新关联代币账户(ATA)、进行NFT转移的步骤及相关代码示例,适合初学者理解Solana的token管理和转移过程。

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

新的 Solana TypeScript 框架:

使用 Kite 简化的 Solana 程序开发。

NFT 和 SOL 转移的区别

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

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

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

交易差异的可视化。

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

前提条件

在继续本教程之前,请确保你具备以下前提条件:

  1. 对 TypeScript 的基本知识。
  2. 在你的计算机上安装了 Node.js
  3. 安装了 npm 或 yarn 包管理器。

构建步骤

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

1. 设置项目

  • 创建一个名为“Transfer”的新目录。
  • 打开终端并导航到项目文件夹。
  • 使用命令 npm init -yyarn init -y 初始化一个新的 Node.js 项目。
  • 运行以下命令安装所需的依赖项:
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() {
  // 转移 NFT 的代码在这里
}

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, // 你要转移的金额。
    0 // 小数,因为这是一个 NFT,你可以保留为 0。
  )
);

在上面的代码中,我们:

  • 定义了我们的前任和当前代币账户。
  • 将要转移的金额设置为 1(因为铸币地址的供应量只有 1)。
  • 将小数设置为 0,因为这是遵循非同质化代币标准的。对于可替代代币,你可以为转移适当地设置小数。

9. 将交易发送到 Solana 网络

const txhash = await connection.sendTransaction(tx, [feePayer, prevOwner]);
console.log(`交易哈希: ${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() {
  // 连接到 Solana。
const connection = new Connection("https://rpc.helius.xyz/?api-key=");

// 新 ATA 的支付方。
const feePayer = Keypair.fromSecretKey(
  bs58.decode("privateKey")
);

// 代币或 NFT 的前任所有者
const prevOwner = Keypair.fromSecretKey(
  bs58.decode("privateKey")
);
// NFT 的铸币地址。
const mintPubkey = new PublicKey("4umMdShNxbdnoV2EZjUp6h5GYYneZFLH9otBEU2K3ZYP");
// NFT 的接收者。
const receiveAdress = new PublicKey('2xSHLfiPs3aEhzbLnYbyzWYMEaYnwSwJwAnVh5CwHWwX')
// 原始代币账户
const tokenAccount1Pubkey = new PublicKey("CE2uTSeVbBhy2Q8qVEnp8qAJYBQkVxMC4uGzchiAn6gG");
let ata = await getAssociatedTokenAddress(
    mintPubkey, // 铸币
    receiveAdress // 所有者
  );
// 创建转移指令,从旧钱包拥有的前 ATA,到新 ATA。
const tokenAccount2Pubkey = new PublicKey(ata);
let tx = new Transaction();
  tx.add(
    createTransferCheckedInstruction(
      tokenAccount1Pubkey, // 从
      mintPubkey, // 铸币
      tokenAccount2Pubkey, // 至
      prevOwner.publicKey, // 拥有者
      1, // 数量
      0 // 小数
    )
  );
  // 此处发送交易。
  console.log(`txhash: ${await connection.sendTransaction(tx, [feePayer, prevOwner])}`);
}

transfer()

请记住将代码中的占位符值替换为你的实际值,例如 RPC URL、私钥和转移的公钥。

结论

恭喜你!你成功构建了通过创建新的关联代币账户 (ATA) 并将 NFT 转移到接收者账户上的代码。在本教程中,你学习了如何建立连接、生成 ATA 和发送交易。你可以将这里学习到的信息应用到你创建的任何去中心化应用示例中。

  • 原文链接: helius.dev/blog/solana-d...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Helius
Helius
https://www.helius.dev/