Instruções de Approve e Revoke
Approve concede a um delegate a autoridade para transferir uma quantidade específica de tokens em nome do dono da conta. Isso permite transferências programáticas de tokens sem conceder controle total da conta.
Revoke remove a autoridade do delegate atual sobre a conta, devolvendo o controle total ao dono da conta.
Antes de podermos delegar ou revogar qualquer conta de token, precisaremos já ter:
Inicializado uma conta
MintInicializado uma conta
TokenouAssociated Tokensobre a qual vamos assumir o controle
Instrução Raw
Usando apenas instruções "raw" sem nenhuma abstração, é assim que aprovar um token ficaria:
const keypair = Keypair.generate();
const tokenAccount = await getAssociatedTokenAddress(
mint.publicKey,
keypair.publicKey,
);
// Criar instrução de criação de ATA
const createAtaInstruction = createAssociatedTokenAccountIdempotentInstruction(
keypair.publicKey, // pagador
tokenAccount, // endereço da conta associated token
destination.publicKey, // dono
mint.publicKey, // mint
);
// Delegar um ATA
const approveInstruction = createApproveInstruction(
tokenAccount // conta
delegate.publicKey, // delegate
keypair.publickey // dono
1e6, // quantidade de tokens
);
const transaction = new Transaction().add(
createAtaInstruction,
approveInstruction,
);
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair]);
console.log(`Contas de token criadas e delegadas! Veja sua TX aqui: https://explorer.solana.com/tx/${signature}?cluster=devnet`);Usando apenas instruções "raw" sem nenhuma abstração, é assim que revogar um token ficaria:
// Revogar o delegate de um ATA
const revokeInstruction = createRevokeInstruction(
tokenAccount // conta
keypair.publickey // dono
);
const transaction = new Transaction().add(revokeInstruction);
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair]);
console.log(`Delegate da conta de token revogado! Veja sua TX aqui: https://explorer.solana.com/tx/${signature}?cluster=devnet`);Instrução Abstraída
É assim que as mesmas instruções ficariam abstraídas com a instrução approve():
const tokenAccount = Keypair.generate();
const ata = await getOrCreateAssociatedTokenAccount(
connection,
keypair,
mint,
tokenAccount.publicKey
);
console.log(`Este é o seu ATA: ${ata.address}!`)
let tx = await approve(
connection,
keypair,
ata.address, // conta Token
delegate-publicKey, // delegate
keypair.publicKey, // dono
1e6, // quantidade
);
console.log(`Delegado com sucesso! Transação aqui: https://explorer.solana.com/tx/${tx}?cluster=devnet`)É assim que as mesmas instruções ficariam abstraídas com a instrução revoke():
let tx = await revoke(
connection,
keypair,
ata.address, // conta Token
keypair.publicKey, // dono
);
console.log(`Delegate revogado com sucesso! Transação aqui: https://explorer.solana.com/tx/${tx}?cluster=devnet`)