Typescript
SPL Token avec Web3.js

SPL Token avec Web3.js

Instructions Approve et Revoke

Approve accorde à un délégué le pouvoir de transférer un montant spécifique de jetons au nom du propriétaire du compte. Cela permet d'effectuer des transferts de jetons de manière programmatique sans donner le contrôle total du compte.

Nous fixons un montant "approuvé". Le délégué ne peut transférer que dans la limite de ce montant

Revoke supprime le pouvoir du délégué actuel sur le compte, redonnant ainsi le contrôle total au propriétaire du compte.

Annule immédiatement toute délégation existante. Seul le propriétaire du compte peut révoquer la délégation (et non le délégué lui-même)

Avant de pouvoir déléguer ou révoquer un compte de jetons, nous devons déjà avoir :

  • Initialisé un compte de Mint
  • Initialisé un compte de Token ou Associated Token que nous allons prendre le contrôle

Le nombre de jetons que nous déléguons est "normalisé" au niveau des décimales. Cela signifie que si nous voulons déléguer 1 jeton comportant 6 décimales, nous devrons en réalité saisir 1e6 comme montant

Instruction Brute

En utilisant uniquement une instruction "brute" sans aucune abstraction, voici à quoi ressemble l'approbation d'un jeton :

ts
const tokenAccount = Keypair.generate();
 
const tokenAccount = await getAssociatedTokenAddress(
    mint.publicKey,
    tokenAccount.publicKey,
);
 
// Create ATA creation instruction
const createAtaInstruction = createAssociatedTokenAccountIdempotentInstruction(
    keypair.publicKey, // payer
    tokenAccount, // associated token account address
    destination.publicKey, // owner
    mint.publicKey, // mint
);
 
// Delegate an ATA 
const approveInstruction = createApproveInstruction(
    tokenAccount // account
    delegate.publicKey, // delegate
    keypair.publickey // owner
    1e6, // amount of tokens
);
 
const transaction = new Transaction().add(
    createAtaInstruction,
    approveInstruction,
);
 
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair]);
 
console.log(`Token accounts created and delegated! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

En utilisant uniquement une instruction "brute" sans aucune abstraction, voici à quoi ressemble la révocation d'un jeton :

ts
// Revoke the delegate of an ATA 
const revokeInstruction = createRevokeInstruction(
    tokenAccount // account
    keypair.publickey // owner
);
 
const transaction = new Transaction().add(revokeInstruction);
 
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair]);
 
console.log(`Token account delegate revoked! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

Instruction Abstraite

Voici à quoi ressemble la même instruction si elle est abstraite à l'aide de l'instruction approve() :

ts
const tokenAccount = Keypair.generate();
 
const ata = await getOrCreateAssociatedTokenAccount(
    connection,
    keypair,
    mint,
    tokenAccount.publicKey
);
 
console.log(`This is your ATA: ${ata.address}!`)
  
let tx = await approve(
    connection,
    keypair,
    ata.address, // token Account
    delegate-publicKey, // delegate
    keypair.publicKey, // owner
    1e6, // amount
);
 
console.log(`Succesfully Delegated!. Transaction Here: https://explorer.solana.com/tx/${tx}?cluster=devnet`)

Voici à quoi ressemble la même instruction si elle est abstraite à l'aide de l'instruction revoke() :

ts
let tx = await revoke(
    connection,
    keypair,
    ata.address, // token Account
    keypair.publicKey, // owner
);
 
console.log(`Succesfully Revoked Delegate!. Transaction Here: https://explorer.solana.com/tx/${tx}?cluster=devnet`)
Blueshift © 2025Commit: 6d01265