NOVO: Helius adquire a Light Protocol
como transferir tokens da Solana usando TypeScript
Blog/Desenvolvimento

Solana Dev 101 — Como transferir tokens da Solana com TypeScript

Líder de Relações com DesenvolvedoresHunter Davis no LinkedIn
4 min de leitura

Na Solana, as contas de token são usadas para armazenar e gerenciar tokens, incluindo tokens não fungíveis (NFTs). Por isso, transferir tokens via código pode ser um pouco complicado para desenvolvedores iniciantes na Solana. Neste tutorial, aprenderemos a transferir NFTs de uma carteira para outra na blockchain da Solana. Para isso, criaremos uma nova Associated Token Account (ATA) para o destinatário e transferiremos o NFT para essa conta.

Diferenças entre transferências de NFTs e SOL

Em uma transferência de token, é necessário criar uma nova Associated Token Account (ATA) para iniciar a transferência do proprietário anterior para o novo proprietário. Isso não ocorre por meio de uma transferência de carteira → carteira.

Isso é diferente de uma transferência comum envolvendo SOL, pois o programa do sistema processa a transferência, e não é necessário criar uma nova ATA para armazenar o SOL envolvido na transação.

Para uma breve representação visual do processo, consulte o seguinte:

Em resumo, em uma transferência de NFT/token, o ativo é enviado da ATA atual para uma ATA recém-criada que pertence ao destinatário, em vez de ser transferido diretamente para a carteira.

Pré-requisitos

Antes de continuar este tutorial, verifique se você atende aos seguintes pré-requisitos:

  1. Conhecimento básico de TypeScript.
  2. Node.js instalado em sua máquina.
  3. Gerenciador de pacotes npm ou yarn instalado.

Etapas de desenvolvimento

Agora, siga as etapas abaixo para criar o código:

1. Configure o projeto

  • Crie um novo diretório chamado “Transfer” para o projeto.
  • Abra um terminal e acesse a pasta do projeto.
  • Inicialize um novo projeto Node.js usando o comando: npm init -y ou yarn init -y.
  • Instale as dependências necessárias executando o comando:
Código
npm install @solana/web3.js @solana/spl-token bs58
  • Crie um novo arquivo TypeScript, por exemplo, transferNFT.ts, e abra-o em um editor de código.

2. Importe as bibliotecas

Importe as bibliotecas necessárias e defina a função de transferência em um novo arquivo transferNFT.ts:

Código
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();

No código acima, importamos os pacotes necessários e também criamos nossa função de transferência.

3. Estabeleça uma conexão com a rede Solana

Código
const connection = new Connection("https://rpc.helius.xyz/?api-key=");

No código acima, usamos nosso RPC da Helius para estabelecer uma conexão com a blockchain da Solana.

4. Defina os pares de chaves do pagador da taxa e do proprietário anterior

Código
const feePayer = Keypair.fromSecretKey(bs58.decode("privateKey"));
const prevOwner = Keypair.fromSecretKey(bs58.decode("privateKey"));

5. Especifique a chave pública do mint e o endereço da carteira do destinatário

A chave pública do mint será o endereço de token do NFT que você deseja transferir:

Código
const mintPubkey = new PublicKey("4umMdShNxbdnoV2EZjUp6h5GYYneZFLH9otBEU2K3ZYP");
const receiveAddress = new PublicKey("2xSHLfiPs3aEhzbLnYbyzWYMEaYnwSwJwAnVh5CwHWwX");

6. Gere o endereço de token associado (ATA) do destinatário

Código
const ata = await getAssociatedTokenAddress(mintPubkey, receiveAddress);

Neste código, definimos o proprietário da nova ATA como a chave pública de um endereço diferente. Ele não precisa ser o pagador da transação.

Defina receiveAddress como o endereço que deve receber o ativo transferido.

7. Especifique as chaves públicas da conta de token de origem e da conta de destino

Código
const tokenAccount1Pubkey = new PublicKey("CE2uTSeVbBhy2Q8qVEnp8qAJYBQkVxMC4uGzchiAn6gG");
const tokenAccount2Pubkey = new PublicKey(ata);

8. Crie uma nova transação e adicione a instrução de transferência

Código
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.
  )
);

No código acima:

  • Definimos as contas de token anterior e atual.
  • Definimos a quantidade a ser transferida como 1 (pois o endereço do mint tem um fornecimento total de apenas 1).
  • Definimos as casas decimais como 0, seguindo o padrão de token não fungível. Para um token fungível, você pode configurar corretamente as casas decimais para a transferência.

9. Envie a transação para a rede Solana

Código
const txhash = await connection.sendTransaction(tx, [feePayer, prevOwner]);
console.log(`Transaction hash: ${txhash}`);

Agora usamos o método sendTransaction para concluir a transação e indicar que o pagador da taxa e o proprietário anterior do ativo devem assiná-la.

Código completo

Código
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()

Lembre-se de substituir os valores de placeholder no código pelos valores reais, como a URL do RPC, as chaves secretas e as chaves públicas da transferência.

Conclusão

Parabéns! Você criou com sucesso o código para transferir NFTs na Solana, criando uma nova Associated Token Account (ATA) e transferindo o NFT para a conta do destinatário. Ao seguir este tutorial, você aprendeu a estabelecer uma conexão, gerar ATAs e enviar transações na blockchain da Solana. Agora você pode aplicar o que aprendeu aqui a qualquer exemplo de dApp que estiver criando.

‍

Assine a Helius

Acompanhe as novidades mais recentes do desenvolvimento Solana e receba atualizações quando publicarmos

Imagem ampliada