//! This example demonstrates the use of the `anchor_spl::token` CPI client. use anchor_lang::prelude::*; use anchor_spl::token::{self, Burn, MintTo, Transfer}; #[program] mod token_proxy { use super::*; pub fn proxy_transfer(ctx: Context, amount: u64) -> ProgramResult { token::transfer(ctx.accounts.into(), amount) } pub fn proxy_mint_to(ctx: Context, amount: u64) -> ProgramResult { token::mint_to(ctx.accounts.into(), amount) } pub fn proxy_burn(ctx: Context, amount: u64) -> ProgramResult { token::burn(ctx.accounts.into(), amount) } } #[derive(Accounts)] pub struct ProxyTransfer<'info> { #[account(signer)] pub authority: AccountInfo<'info>, #[account(mut)] pub from: AccountInfo<'info>, #[account(mut)] pub to: AccountInfo<'info>, pub token_program: AccountInfo<'info>, } #[derive(Accounts)] pub struct ProxyMintTo<'info> { #[account(signer)] pub authority: AccountInfo<'info>, #[account(mut)] pub mint: AccountInfo<'info>, #[account(mut)] pub to: AccountInfo<'info>, pub token_program: AccountInfo<'info>, } #[derive(Accounts)] pub struct ProxyBurn<'info> { #[account(signer)] pub authority: AccountInfo<'info>, #[account(mut)] pub mint: AccountInfo<'info>, #[account(mut)] pub to: AccountInfo<'info>, pub token_program: AccountInfo<'info>, } impl<'a, 'b, 'c, 'info> From<&mut ProxyTransfer<'info>> for CpiContext<'a, 'b, 'c, 'info, Transfer<'info>> { fn from(accounts: &mut ProxyTransfer<'info>) -> CpiContext<'a, 'b, 'c, 'info, Transfer<'info>> { let cpi_accounts = Transfer { from: accounts.from.clone(), to: accounts.to.clone(), authority: accounts.authority.clone(), }; let cpi_program = accounts.token_program.clone(); CpiContext::new(cpi_program, cpi_accounts) } } impl<'a, 'b, 'c, 'info> From<&mut ProxyMintTo<'info>> for CpiContext<'a, 'b, 'c, 'info, MintTo<'info>> { fn from(accounts: &mut ProxyMintTo<'info>) -> CpiContext<'a, 'b, 'c, 'info, MintTo<'info>> { let cpi_accounts = MintTo { mint: accounts.mint.clone(), to: accounts.to.clone(), authority: accounts.authority.clone(), }; let cpi_program = accounts.token_program.clone(); CpiContext::new(cpi_program, cpi_accounts) } } impl<'a, 'b, 'c, 'info> From<&mut ProxyBurn<'info>> for CpiContext<'a, 'b, 'c, 'info, Burn<'info>> { fn from(accounts: &mut ProxyBurn<'info>) -> CpiContext<'a, 'b, 'c, 'info, Burn<'info>> { let cpi_accounts = Burn { mint: accounts.mint.clone(), to: accounts.to.clone(), authority: accounts.authority.clone(), }; let cpi_program = accounts.token_program.clone(); CpiContext::new(cpi_program, cpi_accounts) } }