Instrução de Burn
Destrói tokens permanentemente removendo-os da circulação. Isso reduz a oferta total do token.
Antes de podermos fazer burn de qualquer token, precisaremos já ter:
Inicializado uma conta
Mint.Uma conta
Tokenou contaAssociated Tokenque já tenha pelo menos a quantidade que desejamos fazer burn.
Instrução com Anchor
Com o Anchor, podemos usar os métodos burn e burn_checked do programa Token para queimar tokens.
rust
use anchor_spl::token::{self, Burn, BurnChecked};
// Burn sem verificação de decimais
token::burn(ctx.accounts.burn_ctx(), amount)?;
// Burn com verificação de decimais
token::burn_checked(ctx.accounts.burn_checked_ctx(), amount, decimals)?;A instrução burn_checked é recomendada pois verifica se os decimais correspondem aos decimais do mint.
Contexto da Instrução
Aqui está como definir as estruturas de contexto para as instruções de burn:
rust
#[derive(Accounts)]
pub struct BurnTokens<'info> {
pub owner: Signer<'info>,
#[account(mut)]
pub token_account: Account<'info, TokenAccount>,
#[account(mut)]
pub mint: Account<'info, Mint>,
pub token_program: Program<'info, Token>,
}
impl<'info> BurnTokens<'info> {
pub fn burn_ctx(&self) -> CpiContext<'_, '_, '_, 'info, Burn<'info>> {
let cpi_program = self.token_program.to_account_info();
let cpi_accounts = Burn {
mint: self.mint.to_account_info(),
from: self.token_account.to_account_info(),
authority: self.owner.to_account_info(),
};
CpiContext::new(cpi_program, cpi_accounts)
}
}