НОВОЕ: Helius приобретает Light Protocol
как переводить токены Solana с помощью TypeScript
Блог/Разработка

Solana Dev 101 — как переводить токены Solana с помощью TypeScript

Руководитель отдела по работе с разработчикамиHunter Davis в LinkedIn
Чтение: 4 мин

В Solana токен-аккаунты используются для хранения токенов и управления ими, включая невзаимозаменяемые токены (NFT). Поэтому начинающим разработчикам Solana может быть непросто переводить токены с помощью кода. В этом руководстве мы узнаем, как перевести NFT с одного кошелька на другой в блокчейне Solana. Для этого мы создадим новый ассоциированный токен-аккаунт (ATA) для получателя и переведем NFT на этот аккаунт.

Различия между переводами NFT и SOL

При переводе токена необходимо создать новый ассоциированный токен-аккаунт (ATA), чтобы перевести токен от предыдущего владельца новому. Такой перевод не выполняется напрямую с одного кошелька на другой.

Это отличается от обычного перевода SOL: за перевод отвечает системная программа, а создавать новый ATA для хранения участвующих в транзакции SOL не требуется.

Ниже приведена краткая визуальная схема процесса:

Итак, при переводе NFT или токена актив отправляется из текущего ATA в новый ATA, принадлежащий получателю, а не напрямую в кошелек.

Предварительные требования

Прежде чем приступить к этому руководству, убедитесь, что выполнены следующие требования:

  1. Базовые знания TypeScript.
  2. Node.js, установленный на вашем компьютере.
  3. Установленный менеджер пакетов 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()

Не забудьте заменить значения-заполнители в коде фактическими данными, включая URL RPC, секретные ключи и публичные ключи для перевода.

Заключение

Поздравляем! Вы успешно создали код для перевода NFT в Solana: он создает новый ассоциированный токен-аккаунт (ATA) и переводит NFT на аккаунт получателя. Следуя этому руководству, вы узнали, как установить соединение, сгенерировать ATA и отправить транзакции в блокчейне Solana. Теперь вы можете применять полученные знания в любых создаваемых вами dApp.

‍

Подпишитесь на Helius

Следите за новостями разработки на Solana и получайте уведомления о наших публикациях

Увеличенное изображение