Here is a simple snippet to achieve this ```rust #[program] pub mod anchor_basics_spl { use super::*; pub fn burn_spl_tokens(ctx: Context<BurnSPLToken>, amount: u64) -> Result<()> { let cpi_program = ctx.accounts.token_program.to_account_info(); let cpi_accounts = Burn { mint: ctx.accounts.mint.to_account_info(), from: ctx.accounts.token_account.to_account_info(), authority: ctx.accounts.mint.to_account_info(), }; let bump = &[ctx.bumps.mint]; let signer_seeds: &[&[&[u8]]] = &[&[b"mint", bump]]; let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, signer_seeds); burn(cpi_ctx, amount)?; // todo: calc and transfer sol back to user Ok(()) } } #[derive(Accounts)] pub struct BurnSPLToken<'info> { #[account( mut, seeds = [b"mint"], bump, mint::authority = mint, )] pub mint: Account<'info, Mint>, #[account(mut)] pub token_account: Account<'info, TokenAccount>, #[account(mut)] pub payer: Signer<'info>, pub rent: Sysvar<'info, Rent>, pub system_program: Program<'info, System>, pub token_program: Program<'info, Token>, pub associated_token_program: Program<'info, AssociatedToken>, } ``` In this guide, the mint is a PDA and it maintains authority over itself. This means that any operation that you need to perform must happen through this program.