NOUVEAU : Helius acquiert Light Protocol
comment transférer des jetons Solana avec TypeScript
Blog/Développement

Solana Dev 101 — Comment transférer des jetons Solana avec TypeScript

Responsable des relations développeursHunter Davis sur LinkedIn
4 min de lecture

Sur Solana, les comptes de jetons servent à détenir et à gérer des jetons, notamment des jetons non fongibles (NFT). Le transfert de jetons par code peut donc s'avérer quelque peu complexe pour les développeurs qui débutent sur Solana. Dans ce tutoriel, nous allons apprendre à transférer des NFT d'un portefeuille à un autre sur la blockchain Solana. Pour cela, nous créerons un nouveau compte de jetons associé (ATA) pour le destinataire, puis nous transférerons le NFT vers ce compte.

Différences entre les transferts de NFT et de SOL

Lors d'un transfert de jeton, un nouveau compte de jetons associé (ATA) doit être créé pour effectuer le transfert de l'ancien propriétaire vers le nouveau. Il ne s'agit pas d'un transfert de portefeuille à portefeuille.

Ce processus diffère d'un transfert classique de SOL, car le programme système gère le transfert et aucun nouvel ATA n'est nécessaire pour recevoir les SOL concernés par la transaction.

Pour une brève représentation visuelle du processus, consultez le schéma suivant :

En résumé, lors d'un transfert de NFT ou de jeton, l'actif est envoyé depuis l'ATA actuel vers un nouvel ATA appartenant au destinataire, au lieu d'être transféré directement vers le portefeuille.

Prérequis

Avant de poursuivre ce tutoriel, assurez-vous de disposer des prérequis suivants :

  1. Connaissances de base en TypeScript.
  2. Node.js installé sur votre machine.
  3. Gestionnaire de paquets npm ou yarn installé.

Étapes de création

Suivez maintenant les étapes ci-dessous pour créer le code :

1. Configurer le projet

  • Créez un nouveau répertoire nommé « Transfer » pour votre projet.
  • Ouvrez un terminal et accédez au dossier du projet.
  • Initialisez un nouveau projet Node.js avec la commande : npm init -y ou yarn init -y.
  • Installez les dépendances requises en exécutant la commande :
Code
npm install @solana/web3.js @solana/spl-token bs58
  • Créez un nouveau fichier TypeScript, par exemple transferNFT.ts, puis ouvrez-le dans un éditeur de code.

2. Importer les bibliothèques

Importez les bibliothèques nécessaires et définissez la fonction de transfert dans un nouveau fichier transferNFT.ts :

Code
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();

Dans le code ci-dessus, nous importons les paquets nécessaires et créons notre fonction de transfert.

3. Établir une connexion au réseau Solana

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

Dans le code ci-dessus, nous utilisons notre RPC Helius pour établir une connexion avec la blockchain Solana.

4. Définir les paires de clés du payeur des frais et de l'ancien propriétaire

Code
const feePayer = Keypair.fromSecretKey(bs58.decode("privateKey"));
const prevOwner = Keypair.fromSecretKey(bs58.decode("privateKey"));

5. Spécifier la clé publique du mint et l'adresse du portefeuille du destinataire

La clé publique du mint correspond à l'adresse du jeton du NFT que vous souhaitez transférer :

Code
const mintPubkey = new PublicKey("4umMdShNxbdnoV2EZjUp6h5GYYneZFLH9otBEU2K3ZYP");
const receiveAddress = new PublicKey("2xSHLfiPs3aEhzbLnYbyzWYMEaYnwSwJwAnVh5CwHWwX");

6. Générer l'adresse de jeton associée (ATA) du destinataire

Code
const ata = await getAssociatedTokenAddress(mintPubkey, receiveAddress);

Dans ce code, nous définissons comme nouveau propriétaire de l'ATA la clé publique d'une autre adresse. Il ne doit pas nécessairement s'agir du payeur de la transaction.

Veillez à définir receiveAddress sur l'adresse à laquelle l'actif doit être transféré.

7. Spécifier les clés publiques du compte de jetons source et du compte de destination

Code
const tokenAccount1Pubkey = new PublicKey("CE2uTSeVbBhy2Q8qVEnp8qAJYBQkVxMC4uGzchiAn6gG");
const tokenAccount2Pubkey = new PublicKey(ata);

8. Créer une nouvelle transaction et ajouter l'instruction de transfert

Code
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.
  )
);

Dans le code ci-dessus, nous :

  • Définissons nos comptes de jetons précédent et actuel.
  • Fixons la quantité à transférer à 1, car l'offre de l'adresse du mint est limitée à une seule unité.
  • Fixons le nombre de décimales à 0 afin de respecter la norme des jetons non fongibles. Pour un jeton fongible, vous pouvez définir correctement le nombre de décimales pour le transfert.

9. Envoyer la transaction au réseau Solana

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

Nous utilisons maintenant la méthode sendTransaction pour finaliser la transaction et indiquer que le payeur des frais et l'ancien propriétaire de l'actif doivent la signer.

Code complet

Code
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()

N'oubliez pas de remplacer les valeurs fictives du code par vos valeurs réelles, comme l'URL RPC, les clés secrètes et les clés publiques nécessaires au transfert.

Conclusion

Félicitations ! Vous avez créé le code permettant de transférer des NFT sur Solana en créant un nouveau compte de jetons associé (ATA), puis en transférant le NFT vers le compte du destinataire. Grâce à ce tutoriel, vous avez appris à établir une connexion, à générer des ATA et à envoyer des transactions sur la blockchain Solana. Vous pouvez désormais appliquer ces connaissances à n'importe quel exemple de dApp que vous créez.

‍

Abonnez-vous à Helius

Suivez les dernières actualités du développement sur Solana et recevez une notification à chaque publication

Image agrandie