//! This code was AUTOGENERATED using the kinobi library. //! Please DO NOT EDIT THIS FILE, instead use visitors //! to add features, then rerun kinobi to update it. //! //! [https://github.com/metaplex-foundation/kinobi] //! use borsh::BorshDeserialize; use borsh::BorshSerialize; use solana_program::pubkey::Pubkey; /// Accounts. pub struct AllocateWithSeed { pub new_account: solana_program::pubkey::Pubkey, pub base_account: solana_program::pubkey::Pubkey, } impl AllocateWithSeed { pub fn instruction( &self, args: AllocateWithSeedInstructionArgs, ) -> solana_program::instruction::Instruction { self.instruction_with_remaining_accounts(args, &[]) } #[allow(clippy::vec_init_then_push)] pub fn instruction_with_remaining_accounts( &self, args: AllocateWithSeedInstructionArgs, remaining_accounts: &[solana_program::instruction::AccountMeta], ) -> solana_program::instruction::Instruction { let mut accounts = Vec::with_capacity(2 + remaining_accounts.len()); accounts.push(solana_program::instruction::AccountMeta::new( self.new_account, false, )); accounts.push(solana_program::instruction::AccountMeta::new_readonly( self.base_account, true, )); accounts.extend_from_slice(remaining_accounts); let mut data = AllocateWithSeedInstructionData::new().try_to_vec().unwrap(); let mut args = args.try_to_vec().unwrap(); data.append(&mut args); solana_program::instruction::Instruction { program_id: crate::SYSTEM_ID, accounts, data, } } } #[derive(BorshDeserialize, BorshSerialize)] pub struct AllocateWithSeedInstructionData { discriminator: u32, } impl AllocateWithSeedInstructionData { pub fn new() -> Self { Self { discriminator: 9 } } } #[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct AllocateWithSeedInstructionArgs { pub base: Pubkey, pub seed: String, pub space: u64, pub program_address: Pubkey, } /// Instruction builder for `AllocateWithSeed`. /// /// ### Accounts: /// /// 0. `[writable]` new_account /// 1. `[signer]` base_account #[derive(Clone, Debug, Default)] pub struct AllocateWithSeedBuilder { new_account: Option, base_account: Option, base: Option, seed: Option, space: Option, program_address: Option, __remaining_accounts: Vec, } impl AllocateWithSeedBuilder { pub fn new() -> Self { Self::default() } #[inline(always)] pub fn new_account(&mut self, new_account: solana_program::pubkey::Pubkey) -> &mut Self { self.new_account = Some(new_account); self } #[inline(always)] pub fn base_account(&mut self, base_account: solana_program::pubkey::Pubkey) -> &mut Self { self.base_account = Some(base_account); self } #[inline(always)] pub fn base(&mut self, base: Pubkey) -> &mut Self { self.base = Some(base); self } #[inline(always)] pub fn seed(&mut self, seed: String) -> &mut Self { self.seed = Some(seed); self } #[inline(always)] pub fn space(&mut self, space: u64) -> &mut Self { self.space = Some(space); self } #[inline(always)] pub fn program_address(&mut self, program_address: Pubkey) -> &mut Self { self.program_address = Some(program_address); self } /// Add an aditional account to the instruction. #[inline(always)] pub fn add_remaining_account( &mut self, account: solana_program::instruction::AccountMeta, ) -> &mut Self { self.__remaining_accounts.push(account); self } /// Add additional accounts to the instruction. #[inline(always)] pub fn add_remaining_accounts( &mut self, accounts: &[solana_program::instruction::AccountMeta], ) -> &mut Self { self.__remaining_accounts.extend_from_slice(accounts); self } #[allow(clippy::clone_on_copy)] pub fn instruction(&self) -> solana_program::instruction::Instruction { let accounts = AllocateWithSeed { new_account: self.new_account.expect("new_account is not set"), base_account: self.base_account.expect("base_account is not set"), }; let args = AllocateWithSeedInstructionArgs { base: self.base.clone().expect("base is not set"), seed: self.seed.clone().expect("seed is not set"), space: self.space.clone().expect("space is not set"), program_address: self .program_address .clone() .expect("program_address is not set"), }; accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts) } } /// `allocate_with_seed` CPI accounts. pub struct AllocateWithSeedCpiAccounts<'a, 'b> { pub new_account: &'b solana_program::account_info::AccountInfo<'a>, pub base_account: &'b solana_program::account_info::AccountInfo<'a>, } /// `allocate_with_seed` CPI instruction. pub struct AllocateWithSeedCpi<'a, 'b> { /// The program to invoke. pub __program: &'b solana_program::account_info::AccountInfo<'a>, pub new_account: &'b solana_program::account_info::AccountInfo<'a>, pub base_account: &'b solana_program::account_info::AccountInfo<'a>, /// The arguments for the instruction. pub __args: AllocateWithSeedInstructionArgs, } impl<'a, 'b> AllocateWithSeedCpi<'a, 'b> { pub fn new( program: &'b solana_program::account_info::AccountInfo<'a>, accounts: AllocateWithSeedCpiAccounts<'a, 'b>, args: AllocateWithSeedInstructionArgs, ) -> Self { Self { __program: program, new_account: accounts.new_account, base_account: accounts.base_account, __args: args, } } #[inline(always)] pub fn invoke(&self) -> solana_program::entrypoint::ProgramResult { self.invoke_signed_with_remaining_accounts(&[], &[]) } #[inline(always)] pub fn invoke_with_remaining_accounts( &self, remaining_accounts: &[( &'b solana_program::account_info::AccountInfo<'a>, bool, bool, )], ) -> solana_program::entrypoint::ProgramResult { self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) } #[inline(always)] pub fn invoke_signed( &self, signers_seeds: &[&[&[u8]]], ) -> solana_program::entrypoint::ProgramResult { self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) } #[allow(clippy::clone_on_copy)] #[allow(clippy::vec_init_then_push)] pub fn invoke_signed_with_remaining_accounts( &self, signers_seeds: &[&[&[u8]]], remaining_accounts: &[( &'b solana_program::account_info::AccountInfo<'a>, bool, bool, )], ) -> solana_program::entrypoint::ProgramResult { let mut accounts = Vec::with_capacity(2 + remaining_accounts.len()); accounts.push(solana_program::instruction::AccountMeta::new( *self.new_account.key, false, )); accounts.push(solana_program::instruction::AccountMeta::new_readonly( *self.base_account.key, true, )); remaining_accounts.iter().for_each(|remaining_account| { accounts.push(solana_program::instruction::AccountMeta { pubkey: *remaining_account.0.key, is_signer: remaining_account.1, is_writable: remaining_account.2, }) }); let mut data = AllocateWithSeedInstructionData::new().try_to_vec().unwrap(); let mut args = self.__args.try_to_vec().unwrap(); data.append(&mut args); let instruction = solana_program::instruction::Instruction { program_id: crate::SYSTEM_ID, accounts, data, }; let mut account_infos = Vec::with_capacity(2 + 1 + remaining_accounts.len()); account_infos.push(self.__program.clone()); account_infos.push(self.new_account.clone()); account_infos.push(self.base_account.clone()); remaining_accounts .iter() .for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); if signers_seeds.is_empty() { solana_program::program::invoke(&instruction, &account_infos) } else { solana_program::program::invoke_signed(&instruction, &account_infos, signers_seeds) } } } /// Instruction builder for `AllocateWithSeed` via CPI. /// /// ### Accounts: /// /// 0. `[writable]` new_account /// 1. `[signer]` base_account #[derive(Clone, Debug)] pub struct AllocateWithSeedCpiBuilder<'a, 'b> { instruction: Box>, } impl<'a, 'b> AllocateWithSeedCpiBuilder<'a, 'b> { pub fn new(program: &'b solana_program::account_info::AccountInfo<'a>) -> Self { let instruction = Box::new(AllocateWithSeedCpiBuilderInstruction { __program: program, new_account: None, base_account: None, base: None, seed: None, space: None, program_address: None, __remaining_accounts: Vec::new(), }); Self { instruction } } #[inline(always)] pub fn new_account( &mut self, new_account: &'b solana_program::account_info::AccountInfo<'a>, ) -> &mut Self { self.instruction.new_account = Some(new_account); self } #[inline(always)] pub fn base_account( &mut self, base_account: &'b solana_program::account_info::AccountInfo<'a>, ) -> &mut Self { self.instruction.base_account = Some(base_account); self } #[inline(always)] pub fn base(&mut self, base: Pubkey) -> &mut Self { self.instruction.base = Some(base); self } #[inline(always)] pub fn seed(&mut self, seed: String) -> &mut Self { self.instruction.seed = Some(seed); self } #[inline(always)] pub fn space(&mut self, space: u64) -> &mut Self { self.instruction.space = Some(space); self } #[inline(always)] pub fn program_address(&mut self, program_address: Pubkey) -> &mut Self { self.instruction.program_address = Some(program_address); self } /// Add an additional account to the instruction. #[inline(always)] pub fn add_remaining_account( &mut self, account: &'b solana_program::account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool, ) -> &mut Self { self.instruction .__remaining_accounts .push((account, is_writable, is_signer)); self } /// Add additional accounts to the instruction. /// /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, /// and a `bool` indicating whether the account is a signer or not. #[inline(always)] pub fn add_remaining_accounts( &mut self, accounts: &[( &'b solana_program::account_info::AccountInfo<'a>, bool, bool, )], ) -> &mut Self { self.instruction .__remaining_accounts .extend_from_slice(accounts); self } #[inline(always)] pub fn invoke(&self) -> solana_program::entrypoint::ProgramResult { self.invoke_signed(&[]) } #[allow(clippy::clone_on_copy)] #[allow(clippy::vec_init_then_push)] pub fn invoke_signed( &self, signers_seeds: &[&[&[u8]]], ) -> solana_program::entrypoint::ProgramResult { let args = AllocateWithSeedInstructionArgs { base: self.instruction.base.clone().expect("base is not set"), seed: self.instruction.seed.clone().expect("seed is not set"), space: self.instruction.space.clone().expect("space is not set"), program_address: self .instruction .program_address .clone() .expect("program_address is not set"), }; let instruction = AllocateWithSeedCpi { __program: self.instruction.__program, new_account: self .instruction .new_account .expect("new_account is not set"), base_account: self .instruction .base_account .expect("base_account is not set"), __args: args, }; instruction.invoke_signed_with_remaining_accounts( signers_seeds, &self.instruction.__remaining_accounts, ) } } #[derive(Clone, Debug)] struct AllocateWithSeedCpiBuilderInstruction<'a, 'b> { __program: &'b solana_program::account_info::AccountInfo<'a>, new_account: Option<&'b solana_program::account_info::AccountInfo<'a>>, base_account: Option<&'b solana_program::account_info::AccountInfo<'a>>, base: Option, seed: Option, space: Option, program_address: Option, /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. __remaining_accounts: Vec<( &'b solana_program::account_info::AccountInfo<'a>, bool, bool, )>, }