Skip to main content

carbon_token_program_decoder/instructions/
initialize_multisig.rs

1//! This code was AUTOGENERATED using the Codama library.
2use carbon_core::{account_utils::next_account, deserialize::ArrangeAccounts};
3/// Initializes a multisignature account with N provided signers.
4/// Multisignature accounts can used in place of any single owner/delegate
5/// accounts in any token instruction that require an owner/delegate to be
6/// present. The variant field represents the number of signers (M)
7/// required to validate this multisignature account.
8/// The `InitializeMultisig` instruction requires no signers and MUST be
9/// included within the same Transaction as the system program's
10/// `CreateAccount` instruction that creates the account being initialized.
11/// Otherwise another party can acquire ownership of the uninitialized account.
12#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13#[derive(Debug, Clone, borsh::BorshSerialize, borsh::BorshDeserialize, PartialEq)]
14pub struct InitializeMultisig {
15    /// The number of signers (M) required to validate this multisignature
16    /// account.
17    pub m: u8,
18}
19
20#[derive(Debug, Clone, PartialEq)]
21#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22pub struct InitializeMultisigInstructionAccounts {
23    pub multisig: solana_pubkey::Pubkey,
24    pub rent: solana_pubkey::Pubkey,
25    pub remaining: Vec<solana_instruction::AccountMeta>,
26}
27
28impl InitializeMultisig {
29    pub fn decode(data: &[u8]) -> Option<Self> {
30        if data.is_empty() {
31            return None;
32        }
33        let discriminator = &data[0..1];
34        if discriminator != [2] {
35            return None;
36        }
37
38        let mut data_slice = data;
39
40        data_slice = &data_slice[1..];
41
42        borsh::BorshDeserialize::deserialize(&mut data_slice).ok()
43    }
44}
45
46impl ArrangeAccounts for InitializeMultisig {
47    type ArrangedAccounts = InitializeMultisigInstructionAccounts;
48
49    fn arrange_accounts(
50        accounts: &[solana_instruction::AccountMeta],
51    ) -> Option<Self::ArrangedAccounts> {
52        let mut iter = accounts.iter();
53
54        let multisig = next_account(&mut iter)?;
55        let rent = next_account(&mut iter)?;
56
57        let remaining = iter.as_slice();
58
59        Some(InitializeMultisigInstructionAccounts {
60            multisig,
61            rent,
62            remaining: remaining.to_vec(),
63        })
64    }
65}