squads_multisig_program/state/
transaction_buffer.rs1use anchor_lang::prelude::*;
2use anchor_lang::solana_program::hash::hash;
3
4use crate::errors::MultisigError;
5
6pub const MAX_BUFFER_SIZE: usize = 10128 ;
9
10#[account]
11#[derive(Default, Debug)]
12pub struct TransactionBuffer {
13 pub multisig: Pubkey,
15 pub creator: Pubkey,
17 pub buffer_index: u8,
19 pub vault_index: u8,
21 pub final_buffer_hash: [u8; 32],
23 pub final_buffer_size: u16,
25 pub buffer: Vec<u8>,
27}
28
29impl TransactionBuffer {
30 pub fn size(final_message_buffer_size: u16) -> Result<usize> {
31 if (final_message_buffer_size as usize) > MAX_BUFFER_SIZE {
33 return err!(MultisigError::FinalBufferSizeExceeded);
34 }
35 Ok(
36 8 + 32 + 32 + 1 + 1 + 32 + 2 + 4 + final_message_buffer_size as usize, )
46 }
47
48 pub fn validate_hash(&self) -> Result<()> {
49 let message_buffer_hash = hash(&self.buffer);
50 require!(
51 message_buffer_hash.to_bytes() == self.final_buffer_hash,
52 MultisigError::FinalBufferHashMismatch
53 );
54 Ok(())
55 }
56 pub fn validate_size(&self) -> Result<()> {
57 require_eq!(
58 self.buffer.len(),
59 self.final_buffer_size as usize,
60 MultisigError::FinalBufferSizeMismatch
61 );
62 Ok(())
63 }
64
65 pub fn invariant(&self) -> Result<()> {
66 require!(
67 self.final_buffer_size as usize <= MAX_BUFFER_SIZE,
68 MultisigError::FinalBufferSizeExceeded
69 );
70 require!(
71 self.buffer.len() <= MAX_BUFFER_SIZE,
72 MultisigError::FinalBufferSizeExceeded
73 );
74 require!(
75 self.buffer.len() <= self.final_buffer_size as usize,
76 MultisigError::FinalBufferSizeMismatch
77 );
78
79 Ok(())
80 }
81}