NOUVEAU : Helius acquiert Light Protocol
Comment obtenir la liste des détenteurs d’un token sur Solana
Blog/Développement

Comment obtenir la liste des détenteurs d’un token sur Solana

Ingénieur spécialisé dans l’expérience développeurOwen Venter sur XOwen Venter sur LinkedIn
5 min de lecture

Dans ce guide, nous verrons comment obtenir la liste de tous les détenteurs d’un token fongible tel qu’USDC. Cela peut être utile pour suivre les détenteurs d’un token ou les récompenser au moyen d’un airdrop.

Présentation

Commençons par examiner le fonctionnement des tokens, en particulier des tokens non fongibles, sur Solana. Lorsqu’un développeur crée un token, il utilise le programme de token pour créer un compte de mint. Ce compte de mint contient des informations sur un token donné, comme son nom, son adresse et son image. Une fois le compte de mint créé, le token peut être émis et stocké dans un compte de token. Un compte de token contient des informations sur un token donné appartenant à une adresse précise. Il comprend notamment l’adresse de mint, l’adresse du propriétaire et la quantité de ce token détenue sur le compte. Par exemple, une adresse qui détient des USDC (un token SPL) possède un compte de token pour les USDC.

Maintenant que nous comprenons le fonctionnement des tokens et des comptes de token, nous pouvons chercher à obtenir la liste de tous les détenteurs d’un token donné. Chaque wallet détenant un token spécifique possède un compte de token pour celui-ci. Ce token est donc associé aux comptes de token de tous les wallets qui le détiennent. C’est ainsi que nous allons identifier tous ses détenteurs. Si nous trouvons un moyen de récupérer tous les comptes de token associés à un token, puis les propriétaires de ces comptes, nous obtiendrons la liste de tous ses détenteurs ! 

Méthode getTokenAccounts

Heureusement, la méthode d’API Helius getTokenAccounts nous permet de faire exactement cela. Nous pouvons inclure l’adresse de mint de n’importe quel token dans les paramètres de l’appel d’API afin d’obtenir la liste de tous les comptes de token créés pour celui-ci. L’API renvoie également le propriétaire de chaque compte de token, c’est-à-dire ce que l’on appelle généralement un détenteur de token. Notez simplement qu’un compte peut posséder plusieurs comptes de token pour le même token. Ce n’est pas un problème majeur : il suffit de prévoir une logique pour gérer les comptes de token qui ont le même propriétaire. 

Implémentation

Passons maintenant au code pour voir comment procéder concrètement. Vous aurez besoin d’une clé API Helius pour suivre ce guide. Vous pouvez en obtenir une gratuitement en accédant à votre tableau de bord Helius et en créant un compte. Pour commencer, nous devons créer un fichier JavaScript nommé getTokenHolders.js. Nous pouvons d’abord ajouter notre URL Helius et importer la bibliothèque fs afin d’enregistrer nos résultats dans un fichier JSON.

Code
const url = `https://mainnet.helius-rpc.com/?api-key=`;
const fs = require("fs");

Nous allons ensuite créer une méthode pour récupérer tous les comptes de token associés au token concerné. Commençons par créer une méthode appelée findHolders, qui utilisera la méthode getTokenAccounts pour obtenir les données nécessaires. Vous trouverez plus d’informations sur la méthode getTokenAccounts ici.

Il est important de noter que chaque appel à l’API ne peut renvoyer que 1 000 comptes de token au maximum. La plupart des principaux tokens sur Solana comptent plus de 100 000 comptes de token. Pour contourner cette limite, nous utiliserons la pagination afin de parcourir tous les comptes de token et continuerons à effectuer des appels d’API jusqu’à avoir récupéré les données de tous les comptes de token existants.

Dans la méthode, nous inclurons le mint du token dans les paramètres de l’appel getTokenAccounts. À mesure que nous parcourrons les comptes de token, nous ajouterons chaque propriétaire unique à une liste. Une fois l’exécution de la méthode terminée, nous enregistrerons cette liste dans un fichier JSON contenant tous les détenteurs du token.

Code
const findHolders = async () => {
  // Pagination logic
  let page = 1;
 	// allOwners will store all the addresses that hold the token
  let allOwners = new Set();

  while (true) {
    const response = await fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        method: "getTokenAccounts",
        id: "helius-test",
        params: {
          page: page,
          limit: 1000,
          displayOptions: {},
					//mint address for the token we are interested in
          mint: "CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo",
        },
      }),
    });

		// Check if any error in the response
      if (!response.ok) {
        console.log(
          `Error: ${response.status}, ${response.statusText}`
        );
        break;
      }

    const data = await response.json();
  	// Pagination logic.
    if (!data.result || data.result.token_accounts.length === 0) {
      console.log(`No more results. Total pages: ${page - 1}`);
      break;
    }
    console.log(`Processing results from page ${page}`);
 		// Adding unique owners to a list of token owners.
    data.result.token_accounts.forEach((account) =>
      allOwners.add(account.owner)
    );
    page++;
  }

  fs.writeFileSync(
    "output.json",
    JSON.stringify(Array.from(allOwners), null, 2)
  );
};

‍Dans l’exemple ci-dessus, la méthode getTokenAccounts est appelée plusieurs fois pendant la pagination de tous les comptes de token. La réponse de l’API fournit les données suivantes pour chaque compte de token : 

Code
{
"address": "CVMR1nbxTcQ7Jpa1p137t5TyKFii3Y7Vazt9fFct3tk9",
"mint": "SHDWyBxihqiCj6YekG2GUr7wqKLeLAMK1gHZck9pL6y",
"owner": "CckxW6C1CjsxYcXSiDbk7NYfPLhfqAm3kSB5LEZunnSE",
"amount": 100000000,
"delegated_amount": 0,
"frozen": false
},

Nous avons extrait le propriétaire de ces comptes de token et l’avons ajouté à notre liste. Si nous le souhaitions, nous pourrions également enregistrer la quantité de tokens détenue par chaque compte de token afin d’identifier les principaux détenteurs. 

Une fois cette opération terminée, il ne nous reste plus qu’à appeler la méthode :

Code
findHolders();

Le code complet de notre fichier getTokenHolders.js devrait ressembler à ceci :

Code
const url = `https://mainnet.helius-rpc.com/?api-key=`;
const fs = require("fs");

const findHolders = async () => {
  let page = 1;
  let allOwners = new Set();

  while (true) {
    const response = await fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        method: "getTokenAccounts",
        id: "helius-test",
        params: {
          page: page,
          limit: 1000,
          displayOptions: {},
          mint: "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
        },
      }),
    });

		// Check if any error in the response
      if (!response.ok) {
        console.log(
          `Error: ${response.status}, ${response.statusText}`
        );
        break;
      }

    const data = await response.json();

    if (!data.result || data.result.token_accounts.length === 0) {
      console.log(`No more results. Total pages: ${page - 1}`);

      break;
    }
    console.log(`Processing results from page ${page}`);
    data.result.token_accounts.forEach((account) =>
      allOwners.add(account.owner)
    );
    page++;
  }

  fs.writeFileSync(
    "output.json",
    JSON.stringify(Array.from(allOwners), null, 2)
  );
};

findHolders();

Résultat

Notre code produira une liste de tous les détenteurs qui ressemblera à ceci :

Code
[
  "111An9SVxuPpgjnuXW9Ub7hcVmZpYNrYZF4edsGwJEW",
  "11Mmng3DoMsq2Roq8LBcqdz6d4kw9oSD8oka9Pwfbj",
  "112uNfcC8iwX9P2TkRdJKyPatg6a4GNcr9NC5mTc2z3",
  "113uswn5HNgEfBUKfK4gVBmd2GpZYbxd1N6h1uUWReg",
  "11CyvpdYTqFmCVWbJJeKFNX8F8RSjNSYW5VVUi8eX4P",
  "11MANeaiHEy9S9pRQNu3nqKa2gpajzX2wrRJqWrf8dQ",
…
]

Vous pouvez le tester vous-même grâce à notre exemple Replit.

Conclusion

Pour conclure ce guide, nous avons vu comment identifier les détenteurs d’un token Solana à l’aide de l’API Helius getTokenAccounts. Vous disposez désormais des compétences nécessaires pour interagir directement avec la communauté de votre token, que ce soit pour des airdrops, des analyses ou d’autres opérations. Si vous avez des questions, n’hésitez pas à nous contacter sur Twitter ou Discord. ‍

Abonnez-vous à Helius

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

Image agrandie