litesvm_token/
create_multisig.rs1use {
2 super::{
3 spl_token::{instruction::initialize_multisig2, state::Multisig},
4 TOKEN_ID,
5 },
6 litesvm::{types::FailedTransactionMetadata, LiteSVM},
7 solana_keypair::Keypair,
8 solana_program_pack::Pack,
9 solana_pubkey::Pubkey,
10 solana_signer::Signer,
11 solana_system_interface::instruction::create_account,
12 solana_transaction::Transaction,
13};
14
15pub struct CreateMultisig<'a> {
18 svm: &'a mut LiteSVM,
19 payer: &'a Keypair,
20 signers: &'a [&'a Pubkey],
21 required_signatures: u8,
22 multisig_kp: Option<Keypair>,
23 token_program_id: Option<&'a Pubkey>,
24}
25
26impl<'a> CreateMultisig<'a> {
27 pub fn new(
29 svm: &'a mut LiteSVM,
30 payer: &'a Keypair,
31 signers: &'a [&'a Pubkey],
32 required_signatures: u8,
33 ) -> Self {
34 CreateMultisig {
35 svm,
36 payer,
37 signers,
38 multisig_kp: None,
39 token_program_id: None,
40 required_signatures,
41 }
42 }
43
44 pub fn token_program_id(mut self, program_id: &'a Pubkey) -> Self {
46 self.token_program_id = Some(program_id);
47 self
48 }
49
50 pub fn send(self) -> Result<Pubkey, FailedTransactionMetadata> {
52 let token_program_id = self.token_program_id.unwrap_or(&TOKEN_ID);
53 let multisig_len = Multisig::LEN;
54 let multisig_kp = self.multisig_kp.unwrap_or(Keypair::new());
55 let multisig_pk = multisig_kp.pubkey();
56
57 let ix1 = create_account(
58 &self.payer.pubkey(),
59 &multisig_pk,
60 self.svm.minimum_balance_for_rent_exemption(multisig_len),
61 multisig_len as u64,
62 token_program_id,
63 );
64 let ix2 = initialize_multisig2(
65 token_program_id,
66 &multisig_pk,
67 self.signers,
68 self.required_signatures,
69 )?;
70
71 let block_hash = self.svm.latest_blockhash();
72 let tx = Transaction::new_signed_with_payer(
73 &[ix1, ix2],
74 Some(&self.payer.pubkey()),
75 &[self.payer, &multisig_kp],
76 block_hash,
77 );
78 self.svm.send_transaction(tx)?;
79
80 Ok(multisig_pk)
81 }
82}