
Extensions de tokens prêtes à l’emploi
Introduction
Les extensions de tokens facilitent la création de tokens programmables sur Solana. Les développeurs peuvent combiner plus d’une douzaine d’extensions de mint et de compte grâce au nouveau programme Token Extensions. À l’issue de ce tutoriel, vous saurez créer et manipuler des tokens fongibles et non fongibles, des tokens générant des intérêts, des tokens gelés, des tokens sur lesquels vous disposez d’une autorité absolue — y compris pour les retirer de comptes qui ne vous appartiennent pas — et fermer des comptes de mint pour récupérer des fonds.
Extensions de tokens prêtes à l’emploi est un tutoriel avec des exemples interactifs dans Solana Playground. Il vous aide à découvrir les extensions de tokens avec TypeScript en créant les tokens suivants :
Le code utilisé dans ce tutoriel est adapté du guide du développeur Solana. Les scripts permettant de créer des extensions de tokens se trouvent dans la section Ressources supplémentaires.
Compte d’extensions de tokens
Introduisant de nouvelles instructions, les extensions de tokens reposent sur le Token Program. Les comptes créés avec les deux programmes sont identiques sur leur longueur initiale, jusqu’à la fin des instructions du Token Program et au début de celles des extensions de tokens. Si vous ne connaissez pas bien les données de compte, consultez la section sur l’espace des comptes dans une introduction à Anchor. En bref, les comptes sur Solana doivent être créés avec un espace explicitement alloué au stockage de données on-chain. Cet espace permet de calculer le nombre de lamports requis pour exempter le compte de loyer.
Voici comment créer un compte de mint avec des extensions. Pour allouer de l’espace aux extensions de tokens, utilisez la fonction getMintLen afin d’obtenir la taille du compte de mint avec ses extensions. Dans l’exemple NonFungibleToken.ts, obtenez la longueur du mint pour les types d’extensions MetadataPointer et MintCloseAuthority.
NonFungibleToken.ts ligne 54 :
// Size of Mint Account with extension
const mintLen = getMintLen([
ExtensionType.MetadataPointer,
ExtensionType.MintCloseAuthority,
]);Les extensions de métadonnées et de pointeur de métadonnées permettent de stocker des métadonnées et de les référencer sans dépendre de protocoles tiers. TokenMetadata est une interface de @solana/spl-token-metadata comprenant des champs tels que updateAuthority, mint, name, symbol, uri et additionalMetadata. La longueur des métadonnées s’obtient en utilisant la fonction pack sur l’objet de métadonnées.
NonFungibleToken.ts ligne 60 :
// Metadata to store in Mint Account
const metaData: TokenMetadata = {
updateAuthority: updateAuthority,
mint: mint,
name: "Solana Soldier",
symbol: "SOLD",
uri: "https://shdw-drive.genesysgo.net/G1Tzt42SDqCV3x9vPY5X826foA8fEk8BR4bB5wARh75d/OIG2.jpg",
additionalMetadata: [["armor", null]],
};
// Size of metadata
const metadataLen = pack(metaData).length;
// Size of MetadataExtension 2 bytes for type, 2 bytes for length
const metadataExtension = TYPE_SIZE + LENGTH_SIZE;Additionnez la longueur du mint, l’extension de métadonnées et la longueur des métadonnées pour déterminer le nombre minimal de lamports requis pour le compte de mint.
NonFungibleToken.ts ligne 75 :
// Minimum lamports required for Mint Account
const lamports = await connection.getMinimumBalanceForRentExemption(
mintLen + metadataExtension + metadataLen
);Instructions des extensions de tokens
Des bibliothèques Solana comme @solana/spl-token et @solana/spl-token-metadata ajoutent la prise en charge de TypeScript au programme Token Extensions. Commencez par créer un compte disposant de l’espace adéquat et du nombre de lamports requis pour être exempté de loyer, à l’aide de SystemProgram de @solana/web3.js.
NonFungibleToken.ts ligne 80 :
// Instruction to invoke System Program to create new account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: payer.publicKey, // Account that will transfer lamports to created account
newAccountPubkey: mint, // Address of the account to create
space: mintLen, // Amount of bytes to allocate to the created account
lamports, // Amount of lamports transferred to created account
programId: TOKEN_2022_PROGRAM_ID, // Program assigned as owner of created account
});Nous pouvons ensuite créer les instructions qui définissent le mint. Les instructions suivantes doivent être exécutées avant d’appeler initializeMint. Les instructions précédant le mint utilisées dans Prêt à l’emploi sont :
- Initialiser le pointeur de métadonnées : createInitializeMetadataPointerInstruction
- Initialiser l’autorité de fermeture du mint : createInitializeMintCloseAuthorityInstruction
- Initialiser un mint non transférable : createInitializeNonTransferableMintInstruction
- Initialiser le délégué permanent : createInitializePermanentDelegateInstruction
- Initialiser un mint de token générant des intérêts : createInitializeInterestBearingMintInstruction
Les comptes de métadonnées peuvent être initialisés et mis à jour indépendamment de initializeMint. Le pointeur de métadonnées doit toutefois être initialisé avant le mint. L’ordre des instructions dans la transaction détermine leur ordre d’exécution. Créez un compte de mint, initialisez le pointeur de métadonnées, puis l’autorité de fermeture avec la clé publique du mint. Initialisez ensuite le mint et les comptes de métadonnées, puis mettez à jour les métadonnées supplémentaires.
NonFungibleToken.ts ligne 135 :
transaction = new Transaction().add(
createAccountInstruction,
initializeMetadataPointerInstruction,
initializeMintCloseAuthorityInstruction,
initializeMintInstruction,
initializeMetadataInstruction,
updateFieldInstruction
);Les fichiers nonFungibleToken.ts, soulboundToken.ts, interestBearingToken.ts et delegateToken.ts suivent la même structure pour créer des tokens. Seules les extensions et les instructions utilisées diffèrent.
Le processus commence par l’importation de toutes les fonctions nécessaires depuis les bibliothèques Solana requises, la définition d’un payeur et la génération d’une adresse de mint. Déterminez ensuite l’espace et les lamports nécessaires à l’adresse de mint avec les extensions de tokens souhaitées. Créez des instructions à l’aide des bibliothèques @solana/spl-token et @solana/spl-token-metadata, ajoutez-les à une transaction, envoyez cette transaction au réseau et validez les résultats.
Les opérations sur les tokens, comme le transfert et la destruction, peuvent être utilisées avec différentes extensions de tokens. Les tokens dotés de l’extension de métadonnées peuvent utiliser les instructions createUpdateFieldInstruction et createRemoveKeyInstruction pour mettre à jour ou supprimer des métadonnées, respectivement.
Prêt à l’emploi
Dans Solana Playground, le client contient les fonctions nécessaires pour interagir avec les extensions de tokens. Par exemple, le token lié à l’âme utilise les extensions non transférable et de métadonnées pour créer un NFT lié à l’âme. Les fonctions permettant de créer et de manipuler les tokens sont disponibles dans le même fichier et peuvent être importées. Dans Solana Playground, vous devez copier-coller le code au lieu de l’importer.
Le fichier quest.ts vous permet de jouer au Solana Soldier. Vous pouvez également exécuter chaque fichier contenant des extensions de tokens pour découvrir ses fonctionnalités spécifiques. Le portefeuille Playground a besoin de SOL Devnet pour exécuter la quête. Notre faucet Solana Devnet permet aussi de recevoir des SOL Devnet par airdrop.
La quête commence par la création d’un Solana Soldier, un NFT pour lequel le payeur (pg.wallet.keypair) dispose de l’autorité de fermeture du mint. Il peut ainsi fermer le compte de mint et en récupérer les SOL. Ce mécanisme permet aux applications de récupérer les SOL de comptes devenus inactifs.
Après avoir créé un Solana Soldier, utilisez son adresse de mint pour mettre à jour les métadonnées du NFT. Remplaçons l’armure du soldat par iron. Les fonctions getMetadata, updateMetadata et removeMetadata se trouvent dans le fichier NonFungibleToken.ts à partir de la ligne 167. Ces fonctions peuvent être appelées pour les comptes de mint utilisant l’extension de métadonnées. Par souci de simplicité, les fonctions de métadonnées seront uniquement incluses dans le fichier NonFungibleToken.ts.
Il est maintenant temps de commencer à monter de niveau. Un token générant des intérêts représentera le niveau du Solana Soldier. Depuis InterestBearingToken.ts, importez createInterestBearingToken et utilisez l’instruction pour créer le token. Les intérêts du compte augmenteront selon le taux défini à la ligne 43 de InterestBearingToken.ts. La fonction amountToUiAmount permet de déterminer le nombre de tokens avec les intérêts accumulés. Les intérêts s’accumulent au fil du temps, et nous pouvons appeler amountToUiAmount pour vérifier le niveau du Solana Soldier.
Une fois que le soldat commence à monter de niveau, il doit recevoir une mission. Celle-ci est représentée par un token lié à l’âme : le soldat ne peut pas le transférer — essayez d’intercepter l’erreur en appelant la fonction de transfert — et le seul moyen de s’en débarrasser est de le détruire. Au lieu d’abandonner la mission, examinons-la. Indice : consultez les métadonnées !
Une fois la mission lue, le tutoriel Prêt à l’emploi déploiera une armée vers une adresse de token. Le Solana Soldier doit pouvoir rappeler l’armée vers le payeur après le déploiement des tokens. Les extensions de tokens rendent cela possible grâce à l’autorité déléguée. Celle-ci peut transférer et détruire des tokens, quel qu’en soit le propriétaire. Définissez comme délégué permanent une paire de clés à laquelle vous avez accès. Cette paire de clés doit signer les opérations de destruction et de transfert des tokens.
Les tokens avec délégué représenteront l’armée Solana. Créez des tokens avec délégué dans le compte de tokens de l’ennemi à l’aide de createDelegateTokens, à la ligne 33 de DelegateToken.ts. Une fois les tokens créés, l’armée Solana et l’ennemi s’affrontent dans une bataille fictive. Après la bataille, rappelez les soldats depuis le compte de l’ennemi à l’aide de la fonction transferDelegateTokens, située à la ligne 176 de DelegateTokens.ts.
Vous remarquerez que tous les soldats n’ont pas été rappelés depuis l’adresse de l’ennemi. Supposons qu’ils aient péri. Utilisez la fonction burn de @solana/spl-token pour détruire les tokens restants dans le compte de tokens de l’ennemi (sourceTokenAccount).
Avec la victoire, la quête du Solana Soldier prend fin. La fonction closeAccount de @solana/spl-token a été utilisée pour fermer le compte et restituer le loyer. Parmi les extensions de tokens qui ne sont pas abordées dans cet article figurent les transferts confidentiels, les frais de transfert et les hooks de transfert. Presque toutes les extensions de tokens peuvent être combinées, à quelques exceptions près, comme les hooks de transfert et les tokens non transférables. Les Solana Playgrounds de référence pour les extensions de tokens présentées dans ce tutoriel sont indiqués dans la section Ressources supplémentaires.
Conclusion
Inspiré de CryptoZombies, ce tutoriel Prêt à l’emploi a présenté les bases de la création d’extensions de tokens populaires en combinant plusieurs extensions. Il illustre leur composabilité au moyen d’une expérience de jeu pratique. Les exemples peuvent être utilisés tels quels ou servir de guide aux développeurs qui créent leurs propres tokens. Du dimensionnement des comptes à l’ordre des instructions, ils offrent un processus simplifié pour créer des comptes dotés d’extensions de tokens. Si cette expérience d’apprentissage ludique vous a été utile, partagez vos commentaires sur notre Discord ou mentionnez @helius sur X.
Ressources supplémentaires
- Bien démarrer avec les extensions de tokens
- Solana Soldier sur Solana Playground
- Autorité de fermeture du mint | Solana Playground
- Tokens non transférables | Solana Playground
- Tokens générant des intérêts | Solana Playground
- Délégué permanent | Solana Playground
- Métadonnées | Solana Playground
- GitHub de Token Extensions
- GitHub du Token Program
- GitHub de SPL
Articles associés
Abonnez-vous à Helius
Suivez les dernières actualités du développement sur Solana et recevez une notification à chaque publication


