use anchor_lang::prelude::*;
use anchor_lang::solana_program::borsh0_10::get_instance_packed_len;
use crate::{TransactionMessage, VaultTransactionMessage};
#[account]
#[derive(InitSpace)]
pub struct Batch {
pub multisig: Pubkey,
pub creator: Pubkey,
pub index: u64,
pub bump: u8,
pub vault_index: u8,
pub vault_bump: u8,
pub size: u32,
pub executed_transaction_index: u32,
}
impl Batch {
pub fn invariant(&self) -> Result<()> {
require_gte!(self.size, self.executed_transaction_index);
Ok(())
}
}
#[account]
#[derive(Default)]
pub struct VaultBatchTransaction {
pub bump: u8,
pub ephemeral_signer_bumps: Vec<u8>,
pub message: VaultTransactionMessage,
}
impl VaultBatchTransaction {
pub fn size(ephemeral_signers_length: u8, transaction_message: &[u8]) -> Result<usize> {
let transaction_message: VaultTransactionMessage =
TransactionMessage::deserialize(&mut &transaction_message[..])?.try_into()?;
let message_size = get_instance_packed_len(&transaction_message).unwrap_or_default();
Ok(
8 + 1 + (4 + usize::from(ephemeral_signers_length)) + message_size, )
}
pub fn take(&mut self) -> VaultBatchTransaction {
core::mem::take(self)
}
}