//! Misc optional example is a catchall program for testing unrelated features. //! It's not too instructive/coherent by itself, so please see other examples. use account::MAX_SIZE; use anchor_lang::prelude::*; use context::*; use event::*; mod account; mod context; mod event; declare_id!("FNqz6pqLAwvMSds2FYjR4nKV3moVpPNtvkfGFrqLKrgG"); #[constant] pub const BASE: u128 = 1_000_000; #[constant] pub const DECIMALS: u8 = 6; pub const NO_IDL: u16 = 55; #[program] pub mod misc_optional { use super::*; pub fn initialize(ctx: Context, udata: u128, idata: i128) -> Result<()> { ctx.accounts.data.as_mut().unwrap().udata = udata; ctx.accounts.data.as_mut().unwrap().idata = idata; Ok(()) } pub fn initialize_no_rent_exempt(_ctx: Context) -> Result<()> { Ok(()) } pub fn initialize_skip_rent_exempt(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_owner(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_executable(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_u16(ctx: Context, data: u16) -> Result<()> { ctx.accounts.my_account.as_mut().unwrap().data = data; Ok(()) } pub fn test_simulate(_ctx: Context, data: u32) -> Result<()> { emit!(E1 { data }); emit!(E2 { data: 1234 }); emit!(E3 { data: 9 }); emit!(E5 { data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }); emit!(E6 { data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] }); Ok(()) } pub fn test_input_enum(ctx: Context, data: TestEnum) -> Result<()> { emit!(E7 { data: data }); Ok(()) } pub fn test_i8(ctx: Context, data: i8) -> Result<()> { ctx.accounts.data.as_mut().unwrap().data = data; Ok(()) } pub fn test_i16(ctx: Context, data: i16) -> Result<()> { ctx.accounts.data.as_mut().unwrap().data = data; Ok(()) } pub fn test_const_array_size(ctx: Context, data: u8) -> Result<()> { ctx.accounts.data.as_mut().unwrap().data[0] = data; Ok(()) } pub fn test_const_ix_data_size( ctx: Context, data: [u8; MAX_SIZE], ) -> Result<()> { ctx.accounts.data.as_mut().unwrap().data = data; Ok(()) } pub fn test_close(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_close_twice(ctx: Context) -> Result<()> { let data_account = &ctx.accounts.data.as_ref().unwrap(); let sol_dest_info = ctx.accounts.sol_dest.as_ref().unwrap().to_account_info(); data_account.close(sol_dest_info)?; let data_account_info: &AccountInfo = data_account.as_ref(); require_keys_eq!(*data_account_info.owner, System::id()); Ok(()) } pub fn test_close_mut(ctx: Context) -> Result<()> { let data_account = &ctx.accounts.data.as_ref().unwrap(); let sol_dest_info = ctx.accounts.sol_dest.as_ref().unwrap().to_account_info(); data_account.close(sol_dest_info)?; let data_account_info: &AccountInfo = data_account.as_ref(); require_keys_eq!(*data_account_info.owner, System::id()); Ok(()) } pub fn test_instruction_constraint( _ctx: Context, _nonce: u8, ) -> Result<()> { Ok(()) } pub fn test_pda_init( ctx: Context, _domain: String, _seed: Vec, _bump: u8, ) -> Result<()> { ctx.accounts.my_pda.as_mut().unwrap().data = 6; Ok(()) } pub fn test_pda_init_zero_copy(ctx: Context) -> Result<()> { let mut acc = ctx.accounts.my_pda.as_ref().unwrap().load_init()?; acc.data = 9; acc.bump = *ctx.bumps.get("my_pda").unwrap(); Ok(()) } pub fn test_pda_mut_zero_copy(ctx: Context) -> Result<()> { let mut acc = ctx.accounts.my_pda.as_mut().unwrap().load_mut()?; acc.data = 1234; Ok(()) } pub fn test_token_seeds_init(_ctx: Context) -> Result<()> { Ok(()) } pub fn default<'info>( _program_id: &Pubkey, _accounts: &[AccountInfo<'info>], _data: &[u8], ) -> Result<()> { Err(ProgramError::Custom(1234).into()) } pub fn test_init(ctx: Context) -> Result<()> { ctx.accounts.data.as_mut().unwrap().data = 3; Ok(()) } pub fn test_init_zero_copy(ctx: Context) -> Result<()> { let mut data = ctx.accounts.data.as_ref().unwrap().load_init()?; data.data = 10; data.bump = 2; Ok(()) } pub fn test_init_mint(ctx: Context) -> Result<()> { assert!(ctx.accounts.mint.as_ref().unwrap().decimals == 6); Ok(()) } pub fn test_init_mint_with_token_program(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_init_token(ctx: Context) -> Result<()> { assert!( ctx.accounts.token.as_ref().unwrap().mint == ctx.accounts.mint.as_ref().unwrap().key() ); Ok(()) } pub fn test_init_token_with_token_program(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_composite_payer(ctx: Context) -> Result<()> { ctx.accounts.composite.data.as_mut().unwrap().data = 1; ctx.accounts.data.as_mut().unwrap().udata = 2; ctx.accounts.data.as_mut().unwrap().idata = 3; Ok(()) } pub fn test_init_associated_token(ctx: Context) -> Result<()> { assert!( ctx.accounts.token.as_ref().unwrap().mint == ctx.accounts.mint.as_ref().unwrap().key() ); Ok(()) } pub fn test_init_associated_token_with_token_program(ctx: Context) -> Result<()> { Ok(()) } pub fn test_validate_associated_token( _ctx: Context, ) -> Result<()> { Ok(()) } pub fn test_fetch_all(ctx: Context, filterable: Pubkey) -> Result<()> { ctx.accounts.data.as_mut().unwrap().authority = ctx.accounts.authority.as_ref().unwrap().key(); ctx.accounts.data.as_mut().unwrap().filterable = filterable; Ok(()) } pub fn test_init_with_empty_seeds(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_empty_seeds_constraint(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_init_if_needed(ctx: Context, data: u16) -> Result<()> { ctx.accounts.data.as_mut().unwrap().data = data; Ok(()) } pub fn test_init_if_needed_checks_owner( _ctx: Context, ) -> Result<()> { Ok(()) } pub fn test_init_if_needed_checks_seeds( _ctx: Context, _seed_data: String, ) -> Result<()> { Ok(()) } pub fn test_init_mint_if_needed( _ctx: Context, _decimals: u8, ) -> Result<()> { Ok(()) } pub fn test_init_mint_if_needed_with_token_program( _ctx: Context, ) -> Result<()> { Ok(()) } pub fn test_init_token_if_needed(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_init_token_if_needed_with_token_program(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_init_associated_token_if_needed( _ctx: Context, ) -> Result<()> { Ok(()) } pub fn test_init_associated_token_if_needed_with_token_program( _ctx: Context, ) -> Result<()> { Ok(()) } pub fn init_with_space(_ctx: Context, data: u16) -> Result<()> { Ok(()) } pub fn test_multidimensional_array( ctx: Context, data: [[u8; 10]; 10], ) -> Result<()> { ctx.accounts.data.as_mut().unwrap().data = data; Ok(()) } pub fn test_multidimensional_array_const_sizes( ctx: Context, data: [[u8; 11]; 10], ) -> Result<()> { ctx.accounts.data.as_mut().unwrap().data = data; Ok(()) } pub fn test_no_rent_exempt(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_enforce_rent_exempt(_ctx: Context) -> Result<()> { Ok(()) } pub fn init_decrease_lamports(ctx: Context) -> Result<()> { **ctx .accounts .data .as_mut() .unwrap() .try_borrow_mut_lamports()? -= 1; **ctx .accounts .user .as_mut() .unwrap() .try_borrow_mut_lamports()? += 1; Ok(()) } pub fn init_if_needed_checks_rent_exemption( _ctx: Context, ) -> Result<()> { Ok(()) } pub fn test_program_id_constraint( _ctx: Context, _bump: u8, _second_bump: u8, ) -> Result<()> { Ok(()) } pub fn test_program_id_constraint_find_pda( _ctx: Context, ) -> Result<()> { Ok(()) } pub fn test_token_constraint(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_token_auth_constraint(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_only_auth_constraint(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_only_mint_constraint(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_only_token_program_constraint(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_mint_constraint(_ctx: Context, _decimals: u8) -> Result<()> { Ok(()) } pub fn test_mint_only_decimals_constraint( _ctx: Context, _decimals: u8, ) -> Result<()> { Ok(()) } pub fn test_mint_only_auth_constraint( _ctx: Context, ) -> Result<()> { Ok(()) } pub fn test_mint_only_one_auth_constraint( _ctx: Context, ) -> Result<()> { Ok(()) } pub fn test_mint_miss_mint_auth_constraint( _ctx: Context, _decimals: u8, ) -> Result<()> { Ok(()) } pub fn test_mint_only_token_program_constraint( _ctx: Context, ) -> Result<()> { Ok(()) } pub fn test_associated_constraint(_ctx: Context) -> Result<()> { Ok(()) } pub fn test_associated_token_with_token_program_constraint(_ctx: Context) -> Result<()> { Ok(()) } }