
Solana Dev 101 — как переводить токены Solana с помощью TypeScript
Содержание
- 1. Настройте проект
- 2. Импортируйте библиотеки
- 3. Установите соединение с сетью Solana
- 4. Определите пары ключей плательщика комиссии и предыдущего владельца
- 5. Укажите публичный ключ минта и адрес кошелька получателя
- 6. Сгенерируйте адрес ассоциированного токен-аккаунта (ATA) для получателя
- 7. Укажите публичные ключи исходного токен-аккаунта и аккаунта назначения
- 8. Создайте новую транзакцию и добавьте инструкцию перевода
- 9. Отправьте транзакцию в сеть Solana
- Полный код
В Solana токен-аккаунты используются для хранения токенов и управления ими, включая невзаимозаменяемые токены (NFT). Поэтому начинающим разработчикам Solana может быть непросто переводить токены с помощью кода. В этом руководстве мы узнаем, как перевести NFT с одного кошелька на другой в блокчейне Solana. Для этого мы создадим новый ассоциированный токен-аккаунт (ATA) для получателя и переведем NFT на этот аккаунт.
Упростите разработку программ Solana с помощью Kite.
Различия между переводами NFT и SOL
При переводе токена необходимо создать новый ассоциированный токен-аккаунт (ATA), чтобы перевести токен от предыдущего владельца новому. Такой перевод не выполняется напрямую с одного кошелька на другой.
Это отличается от обычного перевода SOL: за перевод отвечает системная программа, а создавать новый ATA для хранения участвующих в транзакции SOL не требуется.
Ниже приведена краткая визуальная схема процесса:
Итак, при переводе NFT или токена актив отправляется из текущего 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()Не забудьте заменить значения-заполнители в коде фактическими данными, включая URL RPC, секретные ключи и публичные ключи для перевода.
Заключение
Поздравляем! Вы успешно создали код для перевода NFT в Solana: он создает новый ассоциированный токен-аккаунт (ATA) и переводит NFT на аккаунт получателя. Следуя этому руководству, вы узнали, как установить соединение, сгенерировать ATA и отправить транзакции в блокчейне Solana. Теперь вы можете применять полученные знания в любых создаваемых вами dApp.
Похожие статьи
Подпишитесь на Helius
Следите за новостями разработки на Solana и получайте уведомления о наших публикациях


