use anchor_lang::prelude::*;
use anchor_lang::solana_program::hash::hash;
use crate::errors::MultisigError;
pub const MAX_BUFFER_SIZE: usize = 10128 ;
#[account]
#[derive(Default, Debug)]
pub struct TransactionBuffer {
pub multisig: Pubkey,
pub creator: Pubkey,
pub buffer_index: u8,
pub vault_index: u8,
pub final_buffer_hash: [u8; 32],
pub final_buffer_size: u16,
pub buffer: Vec<u8>,
}
impl TransactionBuffer {
pub fn size(final_message_buffer_size: u16) -> Result<usize> {
if (final_message_buffer_size as usize) > MAX_BUFFER_SIZE {
return err!(MultisigError::FinalBufferSizeExceeded);
}
Ok(
8 + 32 + 32 + 1 + 1 + 32 + 2 + 4 + final_message_buffer_size as usize, )
}
pub fn validate_hash(&self) -> Result<()> {
let message_buffer_hash = hash(&self.buffer);
require!(
message_buffer_hash.to_bytes() == self.final_buffer_hash,
MultisigError::FinalBufferHashMismatch
);
Ok(())
}
pub fn validate_size(&self) -> Result<()> {
require_eq!(
self.buffer.len(),
self.final_buffer_size as usize,
MultisigError::FinalBufferSizeMismatch
);
Ok(())
}
pub fn invariant(&self) -> Result<()> {
require!(
self.final_buffer_size as usize <= MAX_BUFFER_SIZE,
MultisigError::FinalBufferSizeExceeded
);
require!(
self.buffer.len() <= MAX_BUFFER_SIZE,
MultisigError::FinalBufferSizeExceeded
);
require!(
self.buffer.len() <= self.final_buffer_size as usize,
MultisigError::FinalBufferSizeMismatch
);
Ok(())
}
}