use super::types::*;
use borsh::BorshSerialize;
use solana_sdk::{
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
};
pub fn build_multisig_create_v2_ix(
program_id: &Pubkey,
program_config: &Pubkey,
treasury: &Pubkey,
multisig: &Pubkey,
create_key: &Pubkey,
creator: &Pubkey,
args: MultisigCreateArgsV2,
) -> eyre::Result<Instruction> {
let discriminator = anchor_discriminator("global", "multisig_create_v2");
let mut data = Vec::new();
data.extend_from_slice(&discriminator);
args.serialize(&mut data)?;
let system_program = SYSTEM_PROGRAM_ID.parse::<Pubkey>()?;
let accounts = vec![
AccountMeta::new_readonly(*program_config, false), AccountMeta::new(*treasury, false), AccountMeta::new(*multisig, false), AccountMeta::new_readonly(*create_key, true), AccountMeta::new(*creator, true), AccountMeta::new_readonly(system_program, false), ];
Ok(Instruction {
program_id: *program_id,
accounts,
data,
})
}
pub fn build_vault_transaction_create_ix(
program_id: &Pubkey,
multisig: &Pubkey,
transaction: &Pubkey,
creator: &Pubkey,
rent_payer: &Pubkey,
args: VaultTransactionCreateArgs,
) -> eyre::Result<Instruction> {
let discriminator = anchor_discriminator("global", "vault_transaction_create");
let mut data = Vec::new();
data.extend_from_slice(&discriminator);
args.serialize(&mut data)?;
let system_program = SYSTEM_PROGRAM_ID.parse::<Pubkey>()?;
let accounts = vec![
AccountMeta::new(*multisig, false), AccountMeta::new(*transaction, false), AccountMeta::new_readonly(*creator, true), AccountMeta::new(*rent_payer, true), AccountMeta::new_readonly(system_program, false), ];
Ok(Instruction {
program_id: *program_id,
accounts,
data,
})
}
pub fn build_proposal_create_ix(
program_id: &Pubkey,
multisig: &Pubkey,
proposal: &Pubkey,
creator: &Pubkey,
rent_payer: &Pubkey,
args: ProposalCreateArgs,
) -> eyre::Result<Instruction> {
let discriminator = anchor_discriminator("global", "proposal_create");
let mut data = Vec::new();
data.extend_from_slice(&discriminator);
args.serialize(&mut data)?;
let system_program = SYSTEM_PROGRAM_ID.parse::<Pubkey>()?;
let accounts = vec![
AccountMeta::new_readonly(*multisig, false), AccountMeta::new(*proposal, false), AccountMeta::new_readonly(*creator, true), AccountMeta::new(*rent_payer, true), AccountMeta::new_readonly(system_program, false), ];
Ok(Instruction {
program_id: *program_id,
accounts,
data,
})
}
pub fn build_proposal_approve_ix(
program_id: &Pubkey,
multisig: &Pubkey,
proposal: &Pubkey,
member: &Pubkey,
) -> eyre::Result<Instruction> {
let discriminator = anchor_discriminator("global", "proposal_approve");
let args_data: Vec<u8> = borsh::to_vec(&None::<String>)?;
let mut data = Vec::new();
data.extend_from_slice(&discriminator);
data.extend_from_slice(&args_data);
let accounts = vec![
AccountMeta::new_readonly(*multisig, false),
AccountMeta::new(*member, true), AccountMeta::new(*proposal, false),
];
Ok(Instruction {
program_id: *program_id,
accounts,
data,
})
}
pub fn build_vault_transaction_execute_ix(
program_id: &Pubkey,
multisig: &Pubkey,
proposal: &Pubkey,
transaction: &Pubkey,
member: &Pubkey,
remaining_accounts: Vec<AccountMeta>,
) -> eyre::Result<Instruction> {
let discriminator = anchor_discriminator("global", "vault_transaction_execute");
let data = discriminator.to_vec();
let mut accounts = vec![
AccountMeta::new_readonly(*multisig, false),
AccountMeta::new(*proposal, false),
AccountMeta::new_readonly(*transaction, false),
AccountMeta::new_readonly(*member, true), ];
accounts.extend(remaining_accounts);
Ok(Instruction {
program_id: *program_id,
accounts,
data,
})
}